HLSL cbuffer,制服,尺寸和偏移量

时间:2013-08-22 07:49:52

标签: directx buffer offset hlsl directx-11

常量缓冲区,在顶点着色器源

中声明
cbuffer c_buffer : register(b0)
{
    matrix <float, 4, 4> u_mvpMatrix;
    matrix <float, 4, 4> m44;
    matrix <float, 3, 3> m33;
    matrix <float, 2, 3> m23;
    matrix <float, 3, 2> m32;
    matrix <float, 1, 3> m13;
}

编译着色器的命令

fxc /nologo /E main /T vs_4_0_level_9_3 /Fh vertex_bytes.h /Vn bytes

最后,生成的vetex_output.h中的注释

// Buffer Definitions: 
//
// cbuffer c_buffer
// {
//
//   float4x4 u_mvpMatrix;              // Offset:    0 Size:    64
//   float4x4 m44;                      // Offset:   64 Size:    64 [unused]
//   float3x3 m33;                      // Offset:  128 Size:    44 [unused]
//   float2x3 m23;                      // Offset:  176 Size:    40 [unused]
//   float3x2 m32;                      // Offset:  224 Size:    28 [unused]
//   float1x3 m13;                      // Offset:  256 Size:    36 [unused]
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// c_buffer                          cbuffer      NA          NA    0        1

期待这样的事情:

//   float4x4 u_mvpMatrix;              // Offset:    0 Size:    64
//   float4x4 m44;                      // Offset:   64 Size:    64 [unused]
//   float3x3 m33;                      // Offset:  128 Size:    36 [unused]
//   float2x3 m23;                      // Offset:  164 Size:    24 [unused]
//   float3x2 m32;                      // Offset:  188 Size:    24 [unused]
//   float1x3 m13;                      // Offset:  212 Size:    12 [unused]

为什么矩阵大小不是行*列* 4而偏移量不是prev_offset + prev_size?

我将所有常量数据作为一个缓冲区发送,在运行时创建

ID3D11Buffer* cb;
CD3D11_BUFFER_DESC cbDesc(buffer_width, D3D11_BIND_CONSTANT_BUFFER);
D11Device->CreateBuffer(&cbDesc, nullptr, &cb)
byte* byte_buffer;
create_and_fill_byte_buffer_here();
D11DeviceContext->UpdateSubresource(cb, 0, NULL, byte_buffer, 0, 0);
D11DeviceContext->VSSetConstantBuffers(0, 1, &cb);

我应该传递什么作为buffer_width?我应该使用什么偏移量来将数据写入byte_buffer?

P.S。此方法适用于更简单的着色器,使用一个4x4矩阵或一个float4向量(buffer_width分别为64和16;零偏移)。

UPD1:好的,偏移量可用“最接近的16倍数”来解释。换句话说 - 每个新常量与新寄存器对齐。但仍然不知道尺寸。

1 个答案:

答案 0 :(得分:6)

偏移和大小可以通过HLSL packing rules来解释。基本上元素对齐到4个字节,不能跨越16字节边界。

例如:

float3x3 m33
float3[ 0 ] X
float3[ 1 ] X
float3[ 2 ] X
Size: 16 + 16 + 12 = 44 bytes
相关问题