1.渲染路径
渲染路径(Rendering Path):决定光照的实现方式。就是当前渲染目标使用光照的流程
2.渲染方式
2.1 前向渲染Forward Rendering
在渲染每一帧时,每个顶点、片元都要执行一次着色器代码。这时需要将所有的光照信息都传递到片元着色器中。虽然大部分情况下的光源都趋向于小型化,而其照亮的区域也不大,但即便是光源离这个像素所对应的世界空间中的位置很远,计算光照时还是会把所有光源考虑进去。复杂度是$O(mn)$ 。
1 | For each light: |
2.2 延迟渲染Deferred Rendering
主要解决大量光照渲染的方案。先不要迭代三角形做光照计算,而是先找出能看到的所有像素,再去迭代光照。直接迭代三角形的话,由于大量三角形不可见,是浪费的。
如前向渲染下,近处光源和远处光源计算量相等。但延迟渲染下,近处的计算量会大于远处。因为远处的像素更少。
Gbuffer
流程:
分成两个pass
- 几何处理pass
- 首先将场景渲染一次,获取待渲染对象的各种几何信息,储存到G-buffer。并且开启深度测试,所以G-buffer只写入最近的片元的信息。
- 光照处理pass
- 遍历所有G-buffer的各种参数,执行光照计算。
1 | For each object: |
复杂度是$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不支持延迟渲染)
- 项目设置Tier Settings 的Rendering Path改为延迟渲染,并勾选Use Defaults
- 相机的Rendering Path使用延迟渲染
3.2 移动端优化
- 两个TBDR
- 一个是SIGGRAPH2010提出,通过分块来降低带宽内存用量
- 一个是PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw
3.3 其他渲染路径
https://zhuanlan.zhihu.com/p/54694743
- 延迟光照 Light Pre-Pass/Deferred Lighting
- 减少G-buffer占用的过多开销,支持多种光照模型
- Forward+ 即Tiled Forward Rendering,分块正向渲染
- 减少带宽,支持多光源,强制需要一个preZ
- 群组渲染Clustered Rendering
- 带宽相对减少,多光源下效率提升
作业
- 总结延迟渲染管线的优缺点
- 文内
- 如何优化(移动端优化技术)
- 3.7见
参考文献
[1] https://www.bilibili.com/video/BV1244y1i7oV
【技术美术百人计划】图形 3.4 延迟渲染管线介绍
[2] https://learnopengl-cn.github.io/05%20Advanced%20Lighting/08%20Deferred%20Shading/