C ++ HLSL缓冲区变量

时间:2012-12-24 12:49:25

标签: c++ buffer shader hlsl directx-11

嗨,大家好,

现在我只想将值传递给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)

谢谢

2 个答案:

答案 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着色器中不会共享顶点着色器中设置的常量缓冲区。)