尝试在 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。
我在几何着色器中有这个
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。