2008-09-15 61 views

回答

2

我没有太多使用Java,但基于white paper from 1984,它应该是渲染状态混合模式的相当直接的映射。

当然,您可以做的不仅仅是这些,比如正常的alpha混合(SourceAlpha,InvSourceAlpha)或者添加剂(One,One)等等。 (我假设你是问关于这些具体,因为你是移植现有的一些功能呢?在此,因为你可能不关心其他组合...)

无论如何,这些假设添加的BlendOperation和AlphaBlendEnable是真正。

清除

SourceBlend = Zero 
DestinationBlend = Zero 

SourceBlend = One 
DestinationBlend = Zero 

SourceBlend = Zero 
DestinationBlend = One 

A对B

SourceBlend = One 
DestinationBlend = InvSourceAlpha 

B,经甲

SourceBlend = InvDestinationAlpha 
DestinationBlend = One 

甲在乙

SourceBlend = DestinationAlpha 
DestinationBlend = One 

B在A中

SourceBlend = Zero 
DestinationBlend = SourceAlpha 

A掉乙

SourceBlend = InvDestinationAlpha 
DestinationBlend = Zero 

B发出甲

SourceBlend = Zero 
DestinationBlend = InvSourceAlpha 

甲顶上乙

SourceBlend = DestinationAlpha 
DestinationBlend = InvSourceAlpha 

乙顶上的

SourceBlend = InvDestinationAlpha 
DestinationBlend = SourceAlpha 

甲XOR B

SourceBlend = InvDestinationAlpha 
DestinationBlend = InvSourceAlpha 

链接这些是有点复杂并需要任一多遍或多种纹理输入到着色器。

0

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

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

0

一两件事来检查,确保阿尔法测试了与

AlphaTestEnable = false 

如果是在(与类似AlphaFunction =大和ReferenceAlpha = 0),清晰的像素可以扔掉不管AlphaBlendEnable设置。

1

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

在B A

SourceBlend = DestinationAlpha 
DestinationBlend = Zero