在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。
启用深度模板可以防止这个问题
这是我面临的简化问题: 使用 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。
启用深度模板可以防止这个问题