应该使用哪些 Direct3D 渲染状态来实现 Java 的 Porter-Duff 合成规则(CLEAR、SRC、SRCOVER 等)?
4 回答
我没有过多地使用 Java,但根据1984 年的白皮书,它应该是渲染状态混合模式的相当简单的映射。
当然,除了这些之外,您还可以做更多的事情,比如普通的 alpha 混合(SourceAlpha、InvSourceAlpha)或加法(One、One)等等。(我假设您之所以特别询问这些是因为您要移植一些现有功能?因此您可能不关心其他组合......)
无论如何,这些假设 Add 的 BlendOperation 并且 AlphaBlendEnable 为真。
清除
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
B在A之上
SourceBlend = InvDestinationAlpha
DestinationBlend = SourceAlpha
异或 B
SourceBlend = InvDestinationAlpha
DestinationBlend = InvSourceAlpha
将这些链接起来稍微复杂一些,并且需要多个通道或多个纹理输入到着色器。
对于“B 中的 A”情况,DestinationBlend 不应该为零吗?
B中的A
SourceBlend = DestinationAlpha
DestinationBlend = Zero
当我实现“A”的渲染状态(即绘制源像素颜色/alpha 并忽略目标像素颜色/alpha)时,如果源的 alpha 值为零,Direct3D 似乎无法正确执行操作。我没有用透明度填充目标区域,而是看到目标区域保持不变。但是,如果我将源 alpha 值更改为 1,则目标区域将“几乎”透明。即使我禁用 alphablending 渲染状态也会发生这种情况,所以我认为这是一种优化尝试,实际上是 Direct3D 中的一个错误。
除了这种情况,Corey 的渲染状态似乎是正确的。谢谢,科里!
要检查的一件事,确保 alpha 测试已关闭
AlphaTestEnable = false
如果启用(以及 AlphaFunction = Greater 和 ReferenceAlpha = 0 之类的东西),则无论 AlphaBlendEnable 设置如何,都可能丢弃清晰的像素。