当我试图在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);
}

知道为什么吗?我不想把这篇文章写得很长,所以细节尽量少。

你的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.

最新更新