【问题标题】:How to setup geometry shaders in HLSL?如何在 HLSL 中设置几何着色器?
【发布时间】:2019-07-21 06:59:58
【问题描述】:

我正在尝试将几何着色器阶段添加到我的管道中,但是当我添加几何着色器功能时,即使是顶点着色器编译也会由于某种原因出现错误(顶点、像素和几何着色器在同一个文件中)。 几何着色器中的代码似乎是导致问题的原因,因为我一删除它,顶点着色器就编译成功了。

我从未在任何 API 中处理过几何着色器,但在我看来,设置几何着色器应该和其他的一样简单,互联网上有一些适用于 DX11 的几何着色器示例,但没有许多。至少我能找到的所有那些都只显示了 hlsl 方面。


cbuffer TickConstantBuffer : register(b0)
{
    matrix World;
    matrix View;
}

cbuffer OnEvent : register(b1)
{
    matrix Projection;
}

float4 VS( float4 Pos : POSITION ) : SV_POSITION
{
    float4 OutPos;

    OutPos = mul(Pos, View);
    OutPos = mul(OutPos, Projection);

    return Pos;
}

[maxvertexcount(4)]
void GS( point float4 input[1], inout TriangleStream<float4> OutputStream )
{
    float4 v;
    OutputStream.Append(float4(input[0].x + 0.5, input[0].y + 0.5, input[0].z, input[0].w));
    OutputStream.Append(float4(input[0].x - 0.5, input[0].y + 0.5, input[0].z, input[0].w));
    OutputStream.Append(float4(input[0].x - 0.5, input[0].y - 0.5, input[0].z, input[0].w));
    OutputStream.Append(float4(input[0].x + 0.5, input[0].y - 0.5, input[0].z, input[0].w));
}

float4 PS( float4 Pos : SV_POSITION ) : SV_Target
{
    return float4( 1.0f, 1.0f, 0.0f, 1.0f );
}

【问题讨论】:

  • 可能是顶点着色器的输出格式和几何着色器的输入格式不匹配。
  • VS 输出浮点数,GS 输入浮点数...
  • 能否添加编译器的错误输出?
  • 谁能帮我解决这个问题stackoverflow.com/questions/62947257/…>

标签: directx-11 hlsl


【解决方案1】:

您的几何着色器没有与之关联的语义。因此,Direct3D 不知道如何将顶点着色器的输出传递给几何着色器,也不知道如何将几何着色器的输出传递给像素着色器。

要解决此问题,您的所有参数都需要具有与之关联的语义。对于输入,这很容易:更改

point float4 input[1]

point float4 input[1] : SV_POSITION

这会将顶点着色器的输出与几何着色器的输入链接起来。

要从几何着色器链接到像素着色器需要更多的工作。由于您已将像素着色器定义为使用SV_POSITION 获取值,因此您需要输出带有该语义的值。但是,您必须将该语义附加到 TriangleStream 的每个元素,并且您不能将语义附加到类型,只能附加到变量,因此 TriangleStream&lt;float4 : SV_POSITION&gt; 之类的内容无法编译。

为了解决这个问题,我们将创建一个包含SV_POSITION语义的成员变量的结构:

struct GSOutput
{
    float4 pos : SV_POSITION;
};

并将我们的TriangleStream 更改为

inout TriangleStream&lt;float4&gt; OutputStream

inout TriangleStream&lt;GSOutput&gt; OutputStream

最后,我们需要修改生成点的方法,因为我们不再简单地将它们添加到列表中:

GSOutput gsout;
gsout.pos = float4(input[0].x + 0.5, input[0].y + 0.5, input[0].z, input[0].w);
OutputStream.Append(gsout);
gsout.pos = float4(input[0].x - 0.5, input[0].y + 0.5, input[0].z, input[0].w);
OutputStream.Append(gsout); 
gsout.pos = float4(input[0].x - 0.5, input[0].y - 0.5, input[0].z, input[0].w);
OutputStream.Append(gsout); 
gsout.pos = float4(input[0].x + 0.5, input[0].y - 0.5, input[0].z, input[0].w);
OutputStream.Append(gsout); 

此时,编译器将文件识别为完全有效的 HLSL 代码,并对其进行正常编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多