在sharpdx中实现透明对象的最简单方法是什么?

时间:2014-09-06 11:25:12

标签: graphics transparency sharpdx

我目前正在尝试在sharpdx中实现半透明多边形。

目前我正在使用GraphicsDevice和BasicEffect绘制我的对象。

// Setup the vertices
game.GraphicsDevice.SetVertexBuffer(myModel.vertices);
game.GraphicsDevice.SetVertexInputLayout(myModel.inputLayout);

// Apply the basic effect technique and draw the object
basicEffect.CurrentTechnique.Passes[0].Apply();
game.GraphicsDevice.Draw(PrimitiveType.TriangleList, myModel.vertices.ElementCount);

这对普通对象很好,但是我想让一些对象部分透明。我已将这些对象颜色的alpha值设置为50,但它们仍然呈现为不透明。我需要做些什么才能达到这个效果?

1 个答案:

答案 0 :(得分:0)

Sharpdx中的透明度要求浮点颜色的alpha混合值为0..1。上面提供的Nico Schertler评论解决了这个问题,可以看作是答案。

在没有Alpha模式的情况下,有两个选项可以在HLSL着色器文件中使用

  • 在Pixel着色器中,根据输入颜色使用clip()函数。您可以定义透明的黑色,并且不显示任何黑色三角形。像这样:

    float4 PS( PS_IN input ) : SV_Target { clip(input.color[3] < 0.1f ? -1:1 ); return input.color; }

ref:https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-clip

查看效果:

enter image description here

  • 修改“顶点着色器”以根据输入颜色将这些顶点投影到(0,0,0)。您可以定义透明的黑色,并且不显示任何黑色三角形。像这样:

    PS_IN VS( VS_IN input) { PS_IN output = (PS_IN)0;
    if ((input.color[0]!=0)||(input.color[1]!=0)||(input.color[2]!=0)) { output.position = mul(worldViewProj,input.position);
    } output.color = input.color; return output; }

请参见下面的HeightField网格边缘的效果,左侧是未更改的版本。

https://i.ibb.co/GC7wwSp/Cheap-Transparent.jpg

注意:后一种解决方案可提供更锐利的边缘,但仅在(0,0,0)位于对象后面时有效。