嗨,大家好,
现在我只想将值传递给hlsl着色器。现在继续着色器中的常量缓冲区:
cbuffer ConstantBuffer
{
float4x4 final;
float4x4 rotation; // the rotation matrix
float4 lightvec; // the light's vector
float4 lightcol; // the light's color
float4 ambientcol; // the ambient light's color
float3 SPACE;
float alpha; // <-- Variable trying to recieve, the first 5 works!
}
在c ++中:
struct CBUFFER
{
public:
D3DXMATRIX Final;
D3DXMATRIX Rotation;
D3DXVECTOR4 LightVector;
D3DXCOLOR LightColor;
D3DXCOLOR AmbientColor;
D3DXVECTOR3 SPACE;
float Alpha;
};
所以我试图将变量对齐,以便能够以16位的数据包发送它们。但由于某种原因,它不起作用,因为着色器中的变量alpha未设置。
那我做错了什么? (PS。我将着色器初始化中的缓冲区宽度设置为:192)
谢谢
答案 0 :(得分:1)
问题在于 bufferwidth 应 208 而不是 192 。 在这种情况下,计算cbuffer大小的总和是:
64 (float4x4 final)+ 64 (float4x4轮换)+ 16 (float4 lightvec)+ 16 (float4 lightcol)+ 16 (float4 ambientcol)+ 16 (float3 SPACE)+ 16 (float alpha)= 208字节< /强>
cbuffer的变量按16个字节的包进行分组,这意味着变量的最小大小为16个字节。这就是为什么'float3 SPACE'和'float alpha'各占16个字节。
“ConstantBuffer”占用13包16个字节(13 * 16 = 208)。
变量可以打包。关键字 “packoffset” 允许您在一个16字节包中打包2,3或4个变量。在这种情况下,打包'float3 SPACE'和'float alpha'会将cbuffer大小减小为 192 :
cbuffer ConstantBuffer
{
float4x4 final : packoffset(c0);
float4x4 rotation : packoffset(c4);
float4 lightvec : packoffset(c8);
float4 lightcol : packoffset(c9);
float4 ambientcol : packoffset(c10);
float3 SPACE : packoffset(c11); // 'SPACE' is mapped to the first 12 bytes of the 12th pack.
float alpha : packoffset(c11.w); // 'alpha' is mapped to the last 4 bytes of the 12th pack.
}
现在计算cbuffer大小的总和是:
64 (float4x4 final)+ 64 (float4x4轮换)+ 16 (float4 lightvec)+ 16 (float4 lightcol)+ 16 (float4 ambientcol)+ 12 (float3 SPACE)+ 4 (float alpha)= 192 bytes < /强>
和“ConstantBuffer”占用12包16个字节(12 * 16 = 192)。
最后应该修改struct “CBUFFER”:
struct CBUFFER
{
public:
D3DXMATRIX Final;
D3DXMATRIX Rotation;
D3DXVECTOR4 LightVector;
D3DXCOLOR LightColor;
D3DXCOLOR AmbientColor;
D3DXVECTOR4 SPACE_and_alpha; // SPACE_and_alpha.xyz = SPACE, SPACE_and_alpha.w = alpha
};
更多包装信息:https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx
答案 1 :(得分:0)
检查de Dave awnser,编译器可能在struct的变量中创建了一个偏移量,以便在CPU提取中使用更快。如果编译指示不起作用,请检查您是否在像素着色器阶段直接使用alpha值并设置正确的常量缓冲区(如果您不使用效果,则在Pixel着色器中不会共享顶点着色器中设置的常量缓冲区。)