0

当分层多个时,我必须至少将它们与“空”图像或背景组合一次。但没有什么比得上“空”。它是透明的黑色或透明的白色。即使是完全透明的,也会有一种在显示时通常会被忽略的颜色。

我想要以下内容:

Destination = Image1 + Image2

为此,我实际上是这样做的:

Clear(Destination, 0); // Clear it with transparent black
Blend Image1 over Destination
Blend Image2 over Destination

虽然目的地是透明的黑色,但黑色有助于最终结果,这是我想避免的。我可以用透明的白色清除目的地,但它只适用于这个例子,并且对较暗的图像产生同样的问题。

结合问题

我理解为什么结果是这样的:directx 混合公式设置如下:

BlendOp = Add;
SrcBlend = SrcAlpha;
DestBlend = InvSrcAlpha;

目的地的 alpha (DestAlpha) 在这个公式中根本没有考虑。我能做些什么来解决这个日常问题,即在将两个图像渲染到其他地方之前将它们混合在一起?

4

1 回答 1

1

Afaik 您无法通过正常的混合操作来实现这一点,但也许您可以编写一个适当的着色器来为您进行混合。您在一个额外的纹理上作为渲染目标进行渲染,并在像素着色器中设置这个纹理。现在您将写入的 alpha 值分支,如果 background-alpha 为零,则写入 imagecolor,否则已经在该像素上写入了图像,您可以在着色器中进行正常的 alpha 混合。使用此分支,您可以检测像素是空的还是之前写入的,然后防止黑色产生任何影响。希望这可以帮助 :)

一个小例子来形象化我的意思:

float4 targetColor = tex2D(backgroundSampler,screen.TexCoord);
float4 diffuse = tex2D(imageSampler,image.TexCoord);
// overwrite black background
if (targetColor.a == 0.0) {
  return diffuse;
}
// do alphablending
return targetColor*(1-diffuse.a)+diffuse*(diffuse.a);
于 2012-12-11T12:56:38.530 回答