在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设置如何,都可以丢弃清晰的像素。