【问题标题】:Merging overlapping transparent shapes in directx在directx中合并重叠的透明形状
【发布时间】:2016-11-22 20:36:11
【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

  • 有几种方法可以做到这一点,因为你用着色器标签标记了你的问题:max(tri1Color, tri2Color);
  • @LJᛃ 感谢您的建议。三角形的数量可以超过两个,如果它们都以最大透明度绘制,结果将是相同的,所以恐怕这行不通
  • 已通过启用深度模板解决,我必须在写入导致此行为的不可见对象之前禁用它。忘记重新启用了。

标签: geometry directx shader sharpdx


【解决方案1】:

我用它来让重叠的透明三角形不“累积”。您需要创建一个混合状态并将其设置为输出合并。

    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。

【讨论】:

  • 感谢您的回答,我想这是要走的路,但我无法让它工作。在 blendstate 上尝试了很多不同的设置,但它并没有达到我想要的效果。 SourceAlphaBlend、DestinationAlphaBlend 和 AlphaBlendOperation 似乎什么也没做。我可能需要向像素着色器添加一些东西吗?
  • code float4 pixelColourBlend; pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy, 0); pixelColourBlend.w = input.uv.w;剪辑(pixelColourBlend.w - 0.05f);返回pixelColourBlend;
  • ' float4 pixelColourBlend; pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy, 0); pixelColourBlend.w = input.uv.w;剪辑(pixelColourBlend.w - 0.05f);返回pixelColourBlend;'
  • 感谢@ErnieDingo 的所有帮助。我研究了你的建议很长一段时间,直到我发现深度模板被禁用,启用时不会发生重叠问题。
  • 适用于颜色,但如果我有一个透明的 BLACK 对象,它就会变得透明。它不喜欢黑色。
【解决方案2】:

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

【讨论】:

  • 请注意,在游戏中,Z 测试通常在 Alpha 上启用,而不是 Z 写入(因此表面不会覆盖不透明的前景项目)。透明物品通常从后到前排序。因此颜色/不透明度的积累。如果您在屏幕上的同一位置有 2 个不同的透明表面,具有相同的 Z 深度,则您最终会出现 Z 冲突,具体取决于您设置的拒绝测试。通常,您设置混合状态。用不同颜色的三角形重新测试你的解决方案,你可能会遇到 z 战斗。祝你好运。
  • 你能分享一些代码sn-p如何启用它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多