Visual LabINTERACTIVE LEARNING
OpenGL 与 3D第 6 / 6 章

PBR 与渲染优化

从物理渲染模型收束到实际项目中的性能优化策略。

OpenGLGLSL渲染管线
进阶预计 62 分钟查看源文 ↗

PBR

全称(physically based rendering),基于物理的渲染

理论
基础介绍
  • 基于能量守恒定律
  • 基于微平面的表面模型
  • 应用基于物理的BRDF (双向反射分布函数 bidirectional reflectance distribution function
微平面模型:

在微观视角下,所有平面都是粗糙的,使用一个统计学的方法来估计表面的粗糙程度

一些概念
  • 辐射通量:辐射通量Φ表示的是一个光源所输出的能量
  • 立体角: 投射到这个单位球体上的截面的面积就被称为立体角(Solid Angle),可以理解为一个带有体积的方向
  • 辐射强度:辐射强度(Radiant Intensity)表示的是在单位球面上,一个光源向每单位立体角所投送的辐射通量,计算方式,辐射通量除以立体角ω
  • 辐照度: 所有投射到点p上的光线的总和
  • 辐射率: 表示一个区域平面上光线总量的物理量,受到入射(Incident)(或者来射)光线与平面法线间的夹角θ的余弦值cosθ的影响
光照
IBL
漫反射辐照
镜面IBL

渲染优化建议

GPU架构解读

由上章的分析,可以很容易给出渲染优化建议:

  • 减少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循环语句,特别是循环次数可变的
    • 减少纹理采样次数
    • 禁用clipdiscard操作
    • 减少复杂数学函数调用

更多优化技巧可阅读:

蒙特卡洛算法