【问题标题】:What is the simplest way to implement transparent objects in sharpdx?在sharpdx中实现透明对象的最简单方法是什么?
【发布时间】:2014-09-06 11:25:11
【问题描述】:

我目前正在尝试在 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,但它们仍被渲染为不透明。我需要做什么才能达到这个效果?

【问题讨论】:

  • 取决于您设置 alpha 值的位置。通常,这是 [0, 1] 范围内的浮点数。
  • 好的,谢谢...我将 alpha 值设置在 [0, 100] 之间。
  • 我遇到了一个新问题 - 每当我将任何新 Color 的变量设置为十进制值时,它似乎都没有正确设置:我将其设置为 'public Color waterColor = new颜色(0, 0, 205, 0.5f);'但是当我打印颜色值是在分配之后它说'A:127 R:0 G:0 B:255'
  • 这就是我问你如何设置颜色的原因。 Color 有不同的构造函数。要么使用 [0, 1] 范围内的所有 float 值,要么使用 [0, 255] 范围内的所有 byte 值。你不应该混淆它。

标签: graphics transparency sharpdx


【解决方案1】:

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

如果没有 Alpha 模式,有两个选项可以在 HLSL 着色器文件中使用

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

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

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

看效果:

  • 修改顶点着色器以将这些顶点投影到 (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 网格边缘的效果,左边是未更改的版本..

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

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2023-03-20
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2013-08-07
    • 2016-02-21
    相关资源
    最近更新 更多