这是我面临的简化问题: 使用directx我需要绘制两个(或更多)完全(在相同的2d平面中)重叠的三角形。三角形是半透明的,但我想释放的效果是它们剪切为单个三角形的透明度。下面的图片可能会更好地描述问题。
有办法做到这一点吗?
答案 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)
启用深度模板可以防止出现此问题