在directx中合并重叠的透明形状

Merging overlapping transparent shapes in directx

这是我面临的简化问题: 使用 directx 我需要精确地(在同一个二维平面中)绘制两个(或更多)重叠的三角形。三角形是半透明的,但我想要释放的效果是它们剪辑到单个三角形的透明度。下图可能更能说明问题。

有办法吗?

我用它来获得重叠的透明三角形而不是 "accumulate"。您需要创建混合状态并将其设置为输出合并。

    blendStateDescription.AlphaToCoverageEnable = false;
        blendStateDescription.RenderTarget[0].IsBlendEnabled = true;
        blendStateDescription.RenderTarget[0].SourceBlend = D3D11.BlendOption.SourceAlpha;
        blendStateDescription.RenderTarget[0].DestinationBlend = D3D11.BlendOption.One; //
        blendStateDescription.RenderTarget[0].BlendOperation = D3D11.BlendOperation.Maximum;
        blendStateDescription.RenderTarget[0].SourceAlphaBlend = D3D11.BlendOption.SourceAlpha; //Zero
        blendStateDescription.RenderTarget[0].DestinationAlphaBlend = D3D11.BlendOption.DestinationAlpha;
        blendStateDescription.RenderTarget[0].AlphaBlendOperation = D3D11.BlendOperation.Maximum;
        blendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11.ColorWriteMaskFlags.All;

希望这对您有所帮助。代码在 C# 中,但它在 C++ 等中的工作方式相同。基本上,获取源和目标的 alpha,比较并获取最大值。这将始终相同(只要您在两个三角形上使用相同的 alpha)否则它将渲染具有最多 alpha 的那个。

编辑:我在我的项目中添加了混合功能的示例。这里的道路重叠。 Overlap Sample

我的像素着色器是:

我在 float4 中传递 UV 坐标。

xy = uv 坐标。 w 是 alpha 值。

像素着色器代码

float4 pixelColourBlend;
pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy,    0);
pixelColourBlend.w = input.uv.w;
clip(pixelColourBlend.w - 0.05f);
return pixelColourBlend;

忽略我的回复,无法编辑它们...grrrr。

启用深度模板可以防止这个问题