OpenGL 与 3D第 6 / 6 章
PBR 与渲染优化
从物理渲染模型收束到实际项目中的性能优化策略。
PBR
全称(physically based rendering),基于物理的渲染
理论
基础介绍
- 基于能量守恒定律
- 基于微平面的表面模型
- 应用基于物理的BRDF (双向反射分布函数 bidirectional reflectance distribution function)
微平面模型:
在微观视角下,所有平面都是粗糙的,使用一个统计学的方法来估计表面的粗糙程度
一些概念:
- 辐射通量:辐射通量Φ表示的是一个光源所输出的能量
- 立体角: 投射到这个单位球体上的截面的面积就被称为立体角(Solid Angle),可以理解为一个带有体积的方向
- 辐射强度:辐射强度(Radiant Intensity)表示的是在单位球面上,一个光源向每单位立体角所投送的辐射通量,计算方式,辐射通量除以立体角ω
- 辐照度: 所有投射到点p上的光线的总和
- 辐射率: 表示一个区域平面上光线总量的物理量,受到入射(Incident)(或者来射)光线与平面法线间的夹角θ的余弦值cosθ的影响
光照
IBL
漫反射辐照
镜面IBL
渲染优化建议
由上章的分析,可以很容易给出渲染优化建议:
减少CPU和GPU的数据交换:
合批(Batch)
减少顶点数、三角形数
视锥裁剪
- BVH
- Portal
- BSP
- OSP
避免每帧提交Buffer数据
- CPU版的粒子、动画会每帧修改、提交数据,可移至GPU端。
减少渲染状态设置和查询
- 例如:
glGetUniformLocation会从GPU内存查询状态,耗费很多时间周期。 - 避免每帧设置、查询渲染状态,可在初始化时缓存状态。
- 例如:
启用GPU Instance
开启LOD
避免从显存读数据
减少过绘制:
避免Tex Kill操作
避免Alpha Test
避免Alpha Blend
开启深度测试
- Early-Z
- 层次Z缓冲(Hierarchical Z-Buffering,HZB)
开启裁剪:
- 背面裁剪
- 遮挡裁剪
- 视口裁剪
- 剪切矩形(scissor rectangle)
控制物体数量
- 粒子数量多且面积小,由于像素块机制,会加剧过绘制情况
- 植物、沙石、毛发等也如此
Shader优化:
- 避免if、switch分支语句
- 避免
for循环语句,特别是循环次数可变的 - 减少纹理采样次数
- 禁用
clip或discard操作 - 减少复杂数学函数调用
更多优化技巧可阅读: