在HLSL中,常量缓冲区 Constant Buffer(简称 CBuffer) 是一种用于在 CPU 与 GPU 之间高效传输常量数据 的机制,其对常量变量使用进行了优化,其特点是访问延迟更低,CPU 更新更频繁。

为什么使用CBuffer

在HLSL中,每个Uniform会被单独分配给一组float4寄存器,造成内存碎片和访问效率低。而CBuffer可以将多个Uniform打包成一块连续内存,使用类似std140的对其策略,提高上传效率和Cache命中率。

CBuffer语法

HLSL
cbuffer MyCBuffer : register(b0)
{
    float4x4 _ViewProjection;
    float3 _LightDirection;
    float _Time;
    float4 _Color;
};

VS_OUTPUT main(VS_INPUT input) {
	_ViewProjection // 可直接调用
}
点击展开查看更多

CPU 与 CBuffer 数据交互(以 DirectX11 为例)

CPP
// 定义结构体
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)
点击展开查看更多

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/%E5%B8%B8%E9%87%8F%E7%BC%93%E5%86%B2%E5%8C%BA-cbuffer/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键