1

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

4

4 回答 4

2

我没有过多地使用 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

将这些链接起来稍微复杂一些,并且需要多个通道或多个纹理输入到着色器。

于 2008-09-15T23:14:41.597 回答
1

对于“B 中的 A”情况,DestinationBlend 不应该为零吗?

B中的A

SourceBlend = DestinationAlpha
DestinationBlend = Zero
于 2011-12-23T21:48:53.183 回答
0

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

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

于 2008-09-16T01:31:40.487 回答
0

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

AlphaTestEnable = false

如果启用(以及 AlphaFunction = Greater 和 ReferenceAlpha = 0 之类的东西),则无论 AlphaBlendEnable 设置如何,都可能丢弃清晰的像素。

于 2008-09-16T05:49:31.193 回答