2016-11-22 44 views
0

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

Current and wanted result

有没有办法做到这一点?

+1

有几种方法可以做到这一点,因为你用的着色器标签标记您的问题:'MAX(tri1Color,tri2Color);' –

+0

@LJᛃ您的建议THX。三角形的数量可以超过两个,如果它们都以最大透明度绘制,结果将是相同的,所以我恐怕这将不起作用 –

+0

通过启用深度模板解决了问题,我必须在写入之前禁用它导致此行为的不可见对象。忘了再次启用它。 –

回答

0

启用深度模具防止这个问题

+0

在游戏中,Z测试通常在Alpha上启用,但不是Z写入(所以表面不会覆盖不透明的地面项目)。透明物品通常从后到前排序。因此积累的颜色/不透明度。如果您在屏幕上的相同位置有两个不同的透明表面,并且Z深度相同,则根据您设置的拒收测试,您最终会进行Z战斗。通常,您设置混合状态。用不同颜色的三角形重新测试您的解决方案,您可能会遇到z战斗。祝你好运。 – ErnieDingo

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值进行比较,并将其作为最大值。这将永远是相同的(只要你在这两个三角形上使用相同的字母),否则它将渲染最多的字母。

编辑:我已经添加了一个混合在我的项目中做了什么的样本。这里的道路重叠。 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。

+0

感谢您的答案,我想这是要走的路,但我不能得到它的工作。在blendstate上尝试了很多不同的设置,但它没有做到我想要的。 SourceAlphaBlend,DestinationAlphaBlend和AlphaBlendOperation似乎什么都不做。我是否需要向像素着色器添加某些内容? –

+0

'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

+0

'float4 pixelColourBlend; \t pixelColourBlend = primaryTexture.Sample(textureSamplerStandard,input.uv.xy,0); pixelColourBlend.w = input.uv.w; clip(pixelColourBlend.w - 0。05F); return pixelColourBlend;' – ErnieDingo