mjo*_*eer 1 directx buffer hlsl directx-11 offset
常量缓冲区,在顶点着色器源中声明
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;
}
Run Code Online (Sandbox Code Playgroud)
用于编译着色器的命令
fxc /nologo /E main /T vs_4_0_level_9_3 /Fh vertex_bytes.h /Vn bytes
Run Code Online (Sandbox Code Playgroud)
最后,生成的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
Run Code Online (Sandbox Code Playgroud)
我期待这样的事情:
// 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]
Run Code Online (Sandbox Code Playgroud)
为什么矩阵大小不是行*列*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);
Run Code Online (Sandbox Code Playgroud)
我应该传递什么作为buffer_width?我应该用什么抵消来将数据写入byte_buffer?
PS此方法适用于更简单的着色器,具有一个4x4矩阵或一个float4向量(buffer_width分别为64和16;零偏移).
UPD1:好的,偏移可以用"最接近的16倍"来解释.换句话说 - 每个新常量与新寄存器对齐.但仍然不知道尺寸.
小智 6
偏移量和尺寸可以通过HLSL 包装规则来解释.基本上元素对齐到4个字节,不能跨越16字节边界.
例如:
float3x3 m33
float3[ 0 ] X
float3[ 1 ] X
float3[ 2 ] X
Size: 16 + 16 + 12 = 44 bytes
Run Code Online (Sandbox Code Playgroud)