尝试在 hlsl 中赋值时我做错了什么?

What am I doing wrong when trying to assign a value in hlsl?

我在几何着色器中有这个

cbuffer cbFixed
{
    float2 TexC[4] =
    {
        float2(0.0f, 1.0f),
        float2(0.0f, 0.0f),
        float2(1.0f, 1.0f),
        float2(1.0f, 0.0f)
    };
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float4 PosWorld : POSITION;
    float4 Norm : NORMAL;
    float2 Tex : TEXCOORD;
    uint PrimID: SV_PrimitiveID;
};

以后...

PS_INPUT gout;

for (int i = 0; i < 4; i++)
{
// other stuff
gout.Tex = TexC[i];
// other stuff
}

但是,出于某种原因,这并没有按预期工作,我的意思是未应用纹理,而这样做:

for (int i = 0; i < 4; i++)
{
    if (i == 0) gout.Tex = float2(0.0f, 1.0f);
    if (i == 1) gout.Tex = float2(0.0f, 0.0f);
    if (i == 2) gout.Tex = float2(1.0f, 1.0f);
    if (i == 3) gout.Tex = float2(1.0f, 0.0f);
}

知道为什么吗?我不想把它写得太长 post 所以尽量减少细节。

你的 TexC 值被忽略了,因为 cbuffer 中的变量必须通过调用 *SetConstantBuffers 来设置,并且像你这样的默认初始化器被忽略,如果你不这样做,你会得到未定义的行为(在大多数情况下你会正在读取零值)。你想要的是这样写:

static const float2 TexC[4] =
    {
        float2(0.0f, 1.0f),
        float2(0.0f, 0.0f),
        float2(1.0f, 1.0f),
        float2(1.0f, 0.0f)
    };

而不是 cbuffer。