0

所以大家好,

现在我只是想将一个值传递给 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.我在shader的初始化中设置bufferwidth为:192)

谢谢你

4

2 回答 2

1

这里的问题是bufferwidth应该是208而不是192。在这种情况下,计算 cbuffer 大小的总和是:

64 (float4x4 final) + 64 (float4x4 rotation) + 16 (float4 lightvec)+ 16 ( float4 lightcol) + 16 ( float4ambientcol) + 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 rotation) + 16 (float4 lightvec)+ 16 ( float4 lightcol) + 16 (float4ambientcol) + 12 (float3 SPACE) + 4 (float alpha) = 192 bytes

“ConstantBuffer”占用12包16字节(12 * 16 = 192)。

最后应该修改结构“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

于 2017-11-10T16:53:16.103 回答
0

检查 de Dave awnser,编译器可能在 struct 的变量中创建了一个偏移量,以使所有这些都更快地用于 CPU 获取。如果 pragma 不起作用,请检查您是否在像素着色器阶段直接使用 alpha 值并设置正确的常量缓冲区(如果您不使用效果,则在顶点着色器中设置的常量缓冲区不会在像素着色器中共享)。

于 2012-12-27T15:49:10.217 回答