DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS
2017-12-12 00:37
274 查看
在之前例子的 shader 里有这样一段代码
这段代码定义了一个 cbuffer 类型的变量 cbPerObject. Constant buffer 时间上就是一个存储能被 shader 访问的变量的数据块, 这个例子中他存储了一个 4 x 4 的矩阵用来表示 WVP 矩阵. 存储在 constant buffer 里的数据是不随顶点改变发生变化的, 但是我们可以通过 C++ 在代码中去更新这个 buffer, 这个特性建立了 C++ 逻辑代码与 shader 的联系.
一般我们在编程的时候最好根据变量更新的频率来设计 cbuffer, 当更新一个 cbuffer 时它的所有成员都需要更新, 所以为了运行效率, 可以将 cbuffer 进行拆分. 以下面的代码为例
WVP 矩阵对于每一个物体都不一样, 当我们这一帧渲染 100 个物体时他将被调用 100 次. 但是第二个 cbuffer 里存储的是场景的光属性, 我们假设这个光是动态的, 所以我们需要每帧跟新一次. 最后一个 cbuffer 存储的是雾的属性, 我们假设雾是基本不会变化的.
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 存储的是雾的属性, 我们假设雾是基本不会变化的.
相关文章推荐
- DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS
- DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
- DirectX11笔记(十二)--Direct3D渲染8--EFFECTS
- DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER
- DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER
- 摸爬滚打DirectX11_day03——Direct3D中的渲染五部曲
- DirectX11笔记(三)--Direct3D初始化2
- DirectX11笔记(三)--Direct3D初始化代码
- DirectX11笔记(四)--渲染管线
- DirectX11 渲染 学习笔记(2) 纹理/贴图映射
- Direct3D学习笔记:渲染管线
- Introduction to 3D Game Programming with DirectX 11学习笔记 6 Direct3D中的绘制(四)渲染状态
- DirectX11笔记(二)--Direct3D初始化1之基本概念
- 【复习笔记】 cocos2d-x 2.x 渲染特效实现 三 高斯模糊效果一
- 页面 渲染 回流 测试 笔记
- 【转载】OLE控件在Direct3D中的渲染方法
- Direct3D渲染管线简介
- Unity Shader入门精要学习笔记 - 第14章 非真实感渲染
- 第四章 Direct3D学习之模型渲染
- (转载)PBRT 学习笔记 颜色在离线渲染中的表示方法