【笔记】【百人计划】图形3.4 延迟渲染管线介绍

1.渲染路径

渲染路径(Rendering Path):决定光照的实现方式。就是当前渲染目标使用光照的流程

2.渲染方式

2.1 前向渲染Forward Rendering

image-20220820011602900

在渲染每一帧时,每个顶点、片元都要执行一次着色器代码。这时需要将所有的光照信息都传递到片元着色器中。虽然大部分情况下的光源都趋向于小型化,而其照亮的区域也不大,但即便是光源离这个像素所对应的世界空间中的位置很远,计算光照时还是会把所有光源考虑进去。复杂度是$O(mn)$ 。

1
2
3
For each light:
For each object affected by the light:
framebuffer += object * light

2.2 延迟渲染Deferred Rendering

image-20220820012923949

主要解决大量光照渲染的方案。先不要迭代三角形做光照计算,而是先找出能看到的所有像素,再去迭代光照。直接迭代三角形的话,由于大量三角形不可见,是浪费的。

如前向渲染下,近处光源和远处光源计算量相等。但延迟渲染下,近处的计算量会大于远处。因为远处的像素更少。

image-20220820012418691

Gbuffer

img

流程:

分成两个pass

  • 几何处理pass
    • 首先将场景渲染一次,获取待渲染对象的各种几何信息,储存到G-buffer。并且开启深度测试,所以G-buffer只写入最近的片元的信息。
  • 光照处理pass
    • 遍历所有G-buffer的各种参数,执行光照计算。
1
2
3
4
For each object:
Render to multiple targets
For each light:
Apply light as a 2D postprocess

复杂度是$O(m+n)$ 。

问题:如何渲染透明物体

透明物体在前向渲染中,一般最后渲染,并且不写入深度。

所以在延迟渲染中,还是需要用前向渲染的方式,最后渲染透明物体

2.3 不同渲染路径的优劣及特性

2.3.1 区别
  • 后处理方式不同

    • 假设需要深度信息来进行后处理,前向渲染就需要单独渲染深度图
  • 着色计算不同

    • 延迟渲染只能计算一个光照模型,因为是统一在LightPass计算的
  • 抗锯齿方式不同

2.3.2 优劣
优点 缺点
前向渲染 1. 支持半透明渲染 1. 光源数量对计算复杂度影响巨大
2. 支持使用多个光照pass 2. 访问深度等数据需要额外计算
3. 支持自定义光照计算方式
延迟渲染 1. 大量光照场景优势明显 1. 对MSAA支持不友好
2. 只渲染可见像素,节省计算量 2. 透明物体渲染存在问题
3. 对后处理支持良好 3. 占用大量的显存带宽
4. 用更少的shader

3.其他

3.1 渲染路径的设置方式

(2021.2版本以前,URP不支持延迟渲染)

  1. 项目设置Tier Settings 的Rendering Path改为延迟渲染,并勾选Use Defaults
  2. 相机的Rendering Path使用延迟渲染

image-20220820014419975

3.2 移动端优化
  • 两个TBDR
    • 一个是SIGGRAPH2010提出,通过分块来降低带宽内存用量
    • 一个是PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw

image-20220820014624273

3.3 其他渲染路径

https://zhuanlan.zhihu.com/p/54694743

  • 延迟光照 Light Pre-Pass/Deferred Lighting
    • 减少G-buffer占用的过多开销,支持多种光照模型
  • Forward+ 即Tiled Forward Rendering,分块正向渲染
    • 减少带宽,支持多光源,强制需要一个preZ
  • 群组渲染Clustered Rendering
    • 带宽相对减少,多光源下效率提升

作业

  1. 总结延迟渲染管线的优缺点
    • 文内
  2. 如何优化(移动端优化技术)
    • 3.7见

参考文献

[1] https://www.bilibili.com/video/BV1244y1i7oV

【技术美术百人计划】图形 3.4 延迟渲染管线介绍

[2] https://learnopengl-cn.github.io/05%20Advanced%20Lighting/08%20Deferred%20Shading/