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

时间:2016-11-22 20:36:12

标签: geometry directx shader sharpdx

这是我面临的简化问题: 使用directx我需要绘制两个(或更多)完全(在相同的2d平面中)重叠的三角形。三角形是半透明的,但我想释放的效果是它们剪切为单个三角形的透明度。下面的图片可能会更好地描述问题。

Current and wanted result

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

我用它来重叠透明三角形而不是“累积”。您需要创建一个blendstate并在输出合并上设置它。

    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 co-ords。

xy = uv coords。 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。

答案 1 :(得分:0)

启用深度模板可以防止出现此问题