在Direct3D中实施Porter-Duff规则

时间:2020-03-05 18:53:25  来源:igfitidea点击:

应使用哪些Direct3D渲染状态来实现Java的Porter-Duff合成规则(CLEAR,SRC,SRCOVER等)?

解决方案

回答

我没有太多使用Java,但是根据1984年的白皮书,它应该是渲染状态混合模式的相当简单的映射。

当然,除了这些之外,我们还可以做更多的事情,例如普通的alpha混合(SourceAlpha,InvSourceAlpha)或者加性(One,One)等等。 (我假设我们是在专门问这些问题,因为我们正在移植一些现有功能?因此,我们可能不在乎其他组合...)

无论如何,这些都假定Add的BlendOperation且AlphaBlendEnable为true。

清除

SourceBlend = Zero
DestinationBlend = Zero

一种

SourceBlend = One
DestinationBlend = Zero

SourceBlend = Zero
DestinationBlend = One

A超过B

SourceBlend = One
DestinationBlend = InvSourceAlpha

B超过A

SourceBlend = InvDestinationAlpha
DestinationBlend = One

B中的A

SourceBlend = DestinationAlpha
DestinationBlend = One

A中的B

SourceBlend = Zero
DestinationBlend = SourceAlpha

A出B

SourceBlend = InvDestinationAlpha
DestinationBlend = Zero

B出A

SourceBlend = Zero
DestinationBlend = InvSourceAlpha

A在B之上

SourceBlend = DestinationAlpha
DestinationBlend = InvSourceAlpha

顶A

SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha

A或者B

SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha

链接这些要稍微复杂一点,并且需要向着色器进行多次传递或者多次输入纹理。

回答

当我实现" A"的渲染状态(即绘制源像素颜色/ alpha并忽略目标像素颜色/ alpha)时,如果源的alpha值为零,Direct3D似乎无法正确执行操作。我没有看到目标区域保持透明,而是看到目标区域保持不变。但是,如果将源Alpha值更改为1,则目标区域将变为"几乎"透明的。即使禁用了alphablending渲染状态,也会发生这种情况,因此我认为这是一种优化尝试,实际上是Direct3D中的错误。

除这种情况外,Corey的渲染状态似乎是正确的。谢谢,科里!

回答

要检查的一件事,请确保已关闭Alpha测试

AlphaTestEnable = false

如果启用该功能(以及类似AlphaFunction = Greater和ReferenceAlpha = 0的功能),则不管AlphaBlendEnable设置如何,都可以丢弃清晰的像素。