我在一个几何着色器中有这个
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.