Geometry 在directx中合并重叠的透明形状

Geometry 在directx中合并重叠的透明形状,geometry,directx,shader,sharpdx,Geometry,Directx,Shader,Sharpdx,这就是我面临的问题: 使用directx,我需要画两个(或更多)完全重叠的三角形(在同一个2d平面上)。三角形是半透明的,但我想释放的效果是,它们剪裁为单个三角形的透明度。下面的图片可以更好地描述这个问题 有什么方法可以做到这一点吗?我用它来让重叠的透明三角形不“累积”。您需要创建一个blendstate并将其设置为输出合并 希望这有帮助。代码在C++中,但是它在C++中是一样的。基本上,取源和目的的alpha,比较并取最大值。这将总是相同的(只要你在三角形上使用相同的alpha),否则它将渲

这就是我面临的问题: 使用directx,我需要画两个(或更多)完全重叠的三角形(在同一个2d平面上)。三角形是半透明的,但我想释放的效果是,它们剪裁为单个三角形的透明度。下面的图片可以更好地描述这个问题


有什么方法可以做到这一点吗?

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

希望这有帮助。代码在C++中,但是它在C++中是一样的。基本上,取源和目的的alpha,比较并取最大值。这将总是相同的(只要你在三角形上使用相同的alpha),否则它将渲染一个具有最大alpha的。 编辑:我已经在我的项目中添加了混合的示例。这里的道路重叠

我的像素着色器如下所示:

我用一个浮点数传递紫外线

xy=紫外线坐标。 w是α值

像素着色器代码

float4 pixelColourBlend;
pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy,    0);
pixelColourBlend.w = input.uv.w;
clip(pixelColourBlend.w - 0.05f);
return pixelColourBlend;

忽略我的回答,无法编辑它们…grrrr。

我使用此选项使重叠的透明三角形不“累积”。您需要创建一个blendstate并将其设置为输出合并

希望这有帮助。代码在C++中,但是它在C++中是一样的。基本上,取源和目的的alpha,比较并取最大值。这将总是相同的(只要你在三角形上使用相同的alpha),否则它将渲染一个具有最大alpha的。 编辑:我已经在我的项目中添加了混合的示例。这里的道路重叠

我的像素着色器如下所示:

我用一个浮点数传递紫外线

xy=紫外线坐标。 w是α值

像素着色器代码

float4 pixelColourBlend;
pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy,    0);
pixelColourBlend.w = input.uv.w;
clip(pixelColourBlend.w - 0.05f);
return pixelColourBlend;


忽略我的回答,无法编辑它们…grrrr。

启用深度模具可防止此问题

启用深度模具可防止此问题

有几种方法可以做到这一点,因为您使用着色器标记了您的问题:
max(tri1Color,tri2Color)@LJᛃ 谢谢你的建议。三角形的数量可以超过两个,如果它们都以最大透明度绘制,结果将是相同的,因此我担心这不会起作用。启用深度模具解决了这个问题,我必须在写入导致此行为的不可见对象之前禁用它。忘了再次启用它。有几种方法可以做到这一点,因为你用着色器标记了你的问题:
max(tri1Color,tri2Color)@LJᛃ 谢谢你的建议。三角形的数量可以超过两个,如果它们都以最大透明度绘制,结果将是相同的,因此我担心这不会起作用。启用深度模具解决了这个问题,我必须在写入导致此行为的不可见对象之前禁用它。忘了再次启用它。谢谢你的回答,我想这是一种方式,但我无法让它工作。在blendstate上尝试了许多不同的设置,但它不符合我的要求。SourceAlphaBlend、DestinationalPhalBlend和AlphaBlendOperation似乎什么都没做。我是否需要向像素着色器添加一些内容?
code
float4 PixelColor Blend;PixelColorBlend=primaryTexture.Sample(纹理采样标准,input.uv.xy,0);PixelColorBlend.w=输入.uv.w;剪辑(PixelColorBlend.w-0.05f);返回PixelColorBlend;'float4像素混合;PixelColorBlend=primaryTexture.Sample(纹理采样标准,input.uv.xy,0);PixelColorBlend.w=输入.uv.w;剪辑(PixelColorBlend.w-0.05f);返回PixelColorBlend;'谢谢所有的帮助@ErnieDingo。我研究了你的建议很长一段时间,直到我发现深度模具被禁用,当启用时,重叠问题不会发生。谢谢你的回答,我想这是一条路,但我无法让它工作。在blendstate上尝试了许多不同的设置,但它不符合我的要求。SourceAlphaBlend、DestinationalPhalBlend和AlphaBlendOperation似乎什么都没做。我是否需要向像素着色器添加一些内容?
code
float4 PixelColor Blend;PixelColorBlend=primaryTexture.Sample(纹理采样标准,input.uv.xy,0);PixelColorBlend.w=输入.uv.w;剪辑(PixelColorBlend.w-0.05f);返回PixelColorBlend;'float4像素混合;PixelColorBlend=primaryTexture.Sample(纹理采样标准,input.uv.xy,0);PixelColorBlend.w=输入.uv.w;剪辑(PixelColorBlend.w-0.05f);返回PixelColorBlend;'谢谢所有的帮助@ErnieDingo。我研究了你的建议很长一段时间,直到我发现深度模具被禁用,当启用时,重叠问题不会发生。只是提醒一下,在游戏中,Z测试通常在Alpha上启用,而不是Z写入(因此曲面不会覆盖不透明的圆形项目)。透明项目通常从后到前排序。因此,颜色/不透明性的积累。如果您在屏幕上的同一位置有两个不同的透明表面,且具有相同的Z深度,则根据您设置的拒绝测试,最终将导致Z冲突。通常,设置混合状态。使用不同颜色的三角形重新测试您的解决方案,您可能会得到z。祝你好运。你能分享一些代码片段如何启用它吗?请注意,在游戏中,Z测试通常在Alpha上启用,但不是Z写入(因此曲面不会覆盖不透明的圆形项目)。透明项目通常从后到前排序。因此,颜色/不透明性的积累。如果您在屏幕上的同一位置有两个不同的透明表面,且具有相同的Z深度,则根据您设置的拒绝测试,最终将导致Z冲突。通常,设置混合状态。使用不同颜色的三角形重新测试您的解决方案,您可能会得到z。好路克
float4 pixelColourBlend;
pixelColourBlend = primaryTexture.Sample(textureSamplerStandard, input.uv.xy,    0);
pixelColourBlend.w = input.uv.w;
clip(pixelColourBlend.w - 0.05f);
return pixelColourBlend;