DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

  在之前例子的 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 存储的是雾的属性, 我们假设雾是基本不会变化的.

上一篇:【DirectX 12 GJ的龙书学习笔记 一】前言与配置环境


下一篇:No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format : or :[:]: