在HLSL中,常量缓冲区 Constant Buffer(简称 CBuffer) 是一种用于在 CPU 与 GPU 之间高效传输常量数据 的机制,其对常量变量使用进行了优化,其特点是访问延迟更低,CPU 更新更频繁。
为什么使用CBuffer
在HLSL中,每个Uniform会被单独分配给一组float4寄存器,造成内存碎片和访问效率低。而CBuffer可以将多个Uniform打包成一块连续内存,使用类似std140的对其策略,提高上传效率和Cache命中率。
CBuffer语法
cbuffer MyCBuffer : register(b0)
{
float4x4 _ViewProjection;
float3 _LightDirection;
float _Time;
float4 _Color;
};
VS_OUTPUT main(VS_INPUT input) {
_ViewProjection // 可直接调用
}MyCBuffer是缓冲区名称(可以省略)register(b0)指定绑定到常量缓冲区寄存器槽位 b0- Shader中可以直接使用CBuffer内的变量
CPU 与 CBuffer 数据交互(以 DirectX11 为例)
// 定义结构体
struct ConstantBuffer {
XMMATRIX viewProj;
XMVECTOR lightDir;
float time;
float padding[3]; // 对齐
};
// 创建 CBuffer
device->CreateBuffer(&bufferDesc, nullptr, &cbuffer);
// 更新数据
deviceContext->UpdateSubresource(cbuffer, 0, nullptr, &data, 0, 0);
// 绑定到 Shader
deviceContext->VSSetConstantBuffers(0, 1, &cbuffer); // 对应 register(b0)