在之前例子的 shader 里有这样一段代码
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
这段代码定义了一个 cbuffer 类型的变量 cbPerObject. Constant buffer 时间上就是一个存储能被 shader 访问的变量的数据块, 这个例子中他存储了一个 4 x 4 的矩阵用来表示 WVP 矩阵. 存储在 constant buffer 里的数据是不随顶点改变发生变化的, 但是我们可以通过 C++ 在代码中去更新这个 buffer, 这个特性建立了 C++ 逻辑代码与 shader 的联系.
一般我们在编程的时候最好根据变量更新的频率来设计 cbuffer, 当更新一个 cbuffer 时它的所有成员都需要更新, 所以为了运行效率, 可以将 cbuffer 进行拆分. 以下面的代码为例
cbuffer cbPerObject
{
float4x4 gWVP;
};
cbuffer cbPerFrame
{
float3 gLightDirection;
float3 gLightPosition;
float4 gLightColor;
};
cbuffer cbRarely
{
float4 gFogColor;
float gFogStart;
float gFogEnd;
};
WVP 矩阵对于每一个物体都不一样, 当我们这一帧渲染 100 个物体时他将被调用 100 次. 但是第二个 cbuffer 里存储的是场景的光属性, 我们假设这个光是动态的, 所以我们需要每帧跟新一次. 最后一个 cbuffer 存储的是雾的属性, 我们假设雾是基本不会变化的.