这是我正面临的简化问题: 使用directx我需要在两个(或多个)完全相同的(在相同的2d平面中)重叠的三角形绘制。三角形是半透明的,但我想要释放的效果是它们剪裁成单个三角形的透明度。下面的图片可能会更好地描述问题。在directx中合并重叠的透明形状
有没有办法做到这一点?
这是我正面临的简化问题: 使用directx我需要在两个(或多个)完全相同的(在相同的2d平面中)重叠的三角形绘制。三角形是半透明的,但我想要释放的效果是它们剪裁成单个三角形的透明度。下面的图片可能会更好地描述问题。在directx中合并重叠的透明形状
有没有办法做到这一点?
启用深度模具防止这个问题
在游戏中,Z测试通常在Alpha上启用,但不是Z写入(所以表面不会覆盖不透明的地面项目)。透明物品通常从后到前排序。因此积累的颜色/不透明度。如果您在屏幕上的相同位置有两个不同的透明表面,并且Z深度相同,则根据您设置的拒收测试,您最终会进行Z战斗。通常,您设置混合状态。用不同颜色的三角形重新测试您的解决方案,您可能会遇到z战斗。祝你好运。 – ErnieDingo
我用这个来获得重叠的透明三角形而不是“积累”。您需要创建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值进行比较,并将其作为最大值。这将永远是相同的(只要你在这两个三角形上使用相同的字母),否则它将渲染最多的字母。
编辑:我已经添加了一个混合在我的项目中做了什么的样本。这里的道路重叠。 Overlap Sample
我的像素着色器是为:
我通过UV共ORDS在个float4。
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。
感谢您的答案,我想这是要走的路,但我不能得到它的工作。在blendstate上尝试了很多不同的设置,但它没有做到我想要的。 SourceAlphaBlend,DestinationAlphaBlend和AlphaBlendOperation似乎什么都不做。我是否需要向像素着色器添加某些内容? –
'code' float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0.05f); return pixelColourBlend; – ErnieDingo
'float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0。05F); return pixelColourBlend;' – ErnieDingo
有几种方法可以做到这一点,因为你用的着色器标签标记您的问题:'MAX(tri1Color,tri2Color);' –
@LJᛃ您的建议THX。三角形的数量可以超过两个,如果它们都以最大透明度绘制,结果将是相同的,所以我恐怕这将不起作用 –
通过启用深度模板解决了问题,我必须在写入之前禁用它导致此行为的不可见对象。忘了再次启用它。 –