https://space.bilibili.com/7398208?spm_id_from=333.788.b_765f7570696e666f.1
?渲染路径(Rendering Path)
?它决定了光照如何应用到unity shader中。换句话讲,它是当前渲染目标使用光照的流程。
?渲染方式
?前向渲染(Forward Rendering)
概述

?在渲染每一帧时,每一个顶点/片元都要执行一次片元着色器中的代码,这时需要将所有的光照信息都传递到片元着色器中进行计算,包括了即使距离很远影响微乎其微的小型光源,会造成很大的浪费

例如,物体受n个光源影响,那么在每一个片元执行着色器代码时,都必须把这n个光源都传递进着色器中执行光照计算。
流程
规则1:最亮的几个光源会被实现为像素光照
规则2:最多四个光源会被实现为顶点光照
规则3:剩下的光源会实现为效率较高的球面调谐光照(Spherical Hamanic),这是一种模拟光照
补充?
- 最亮的那盏光一定是像素光照
- Light的Render Mode是important的光一定是像素光照
- 如果前面的两条加起来的像素光照小于Quality Setting里的Pixel Light Count(最大像素光照数量),那么从剩下的光源中找出最亮的那几盏光源,实现为像素光照。
- 最后剩下的光源,按照规则2或3。
- 在base pass里执行一盏像素光、所有的顶点光和球面调谐光照,并且进行阴影计算。
- 其余的像素光每盏一个Additional Pass,并且这些pass里没有阴影计算。
- 场景中看到的阴影,全是base pass里计算出最亮那盏像素光的阴影,其他像素光是不计算阴影的。
?
逐像素处理的光源数目可以在如下图的地方进行设置,会影响性能开耗?

?延迟渲染-Deferred Rendering
主要解决大量光照渲染的方案。实质上是先不迭代三角形做光照计算,而是先找出能看到的所有像素再去迭代光照,避免在看不到的三角形上造成浪费
概述

?过程可以拆分为两个pass
第一个pass:几何处理通路。
- 首先将场景渲染一次,获取到的待渲染对象的各种几何信息存储到名为G-buffer的缓冲区中,这些缓冲区用来之后进行更复杂的光照计算。
- 由于有深度测试,所以最终写入G-buffer中的,都是离摄像机最近的片元的集合属性,这就意味着,在G-buffer中的片元必定要进行光照计算。
第二个pass:光照处理通路。
- 这个pass会遍历所有G-buffer中的位置、颜色、法线等参数,执行一次光照计算。
- 透明物体没有深度信息,所以还是以前向渲染的方式在最后渲染
G-buffer的概念
RT(G-buffer)相当于把整个屏幕的信息绘制到一个图中,每个RT都可以写到一个G-buffer中
G-buffer中的数据都是2D的,所以我们的光照计算就相当于一个2D光照后处理
下图是经典G-buffer?

UE4中的G-buffer?

?不同渲染路径的特性?
1.后处理方式不同
如何需要深度信息进行后处理的话
- 前向渲染需要单独渲染出一张深度图
- 延迟渲染直接用G-buffer中的深度信息计算即可
2.着色计算不同(shader)
延迟渲染:因为是最后统一计算光照的,所以只能算一个光照模型(如果需要其他光照模型,只能切换pass)

?3.抗锯齿方式不同
?优缺点

?渲染路径的设置

?
?移动端优化TBDR
有两个TBDR,名字一样,内容不同
一个是SIGGRAPH 2010上提出的,通过分块来降低带宽内存用量(需要规划很多G-buffer)

?一个是PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw
PowerVR基于手机GPU的TBR框架提出的改进,通过HSR减少Overdraw
TBDR这个架构是PowerVR提出来的对TBR的一次改进,在TBR的基础上再加了一个Deferred。
通过做一些可见性测试来减少Overdraw
涉及手机GPU架构,和延迟渲染没什么关系
这里提到的关于TBR 、PowerVR提出的TBRD,作业部分有整理,详细的也可以看知乎的这篇文章https://zhuanlan.zhihu.com/p/259760974

?其他渲染路径
延迟光照(Light Pre-Pass / Deferred Lighting)
- 减少G-buffer占用的过多开销,支持多种光照模型
- 和延迟渲染的区别:用更少的buffe信息,着色计算的时候用的是forward,所以第三步开始都是前向渲染(可以对不同的物体进行不同的光照模型)
Forward+(即Tiled Forward Rendering,分块正向渲染)
- 减少带宽,支持多光源,强制需要一个preZ
- 通过分块索引的方式,以及深度和法线信息来到需要进行光照计算的片元进行光照计算。
- 需要法线和深度的后处理需要单独渲染一个rt出来
- 强制使用了一个preZ,进行了一个深度预计算。
群组渲染(Clustered Rendering)
- 带宽相对减少,多光源下效率提升
- 分为forward和deferred两种
延迟渲染中MSAA存在的问题
- 前边补充的图里有提到“NO MSAA Possible”,也就是说延迟渲染管线不支持MSAA
- MSAA在延迟渲染中存在的问题:像素已经被光栅化了,所以没法用更大的像素来渲染
作业
总结延迟渲染管线的优缺点
优点:
- 1.大量光照场景优势明显
- 2.只渲染可见像素,节省计算量
- 3.对后处理支持良好(例如深度信息:直接拿G-buffer中的就行)
缺点:
-
- 涉及一个clear的操作,如果不清理的话,后边可以继续获取到
- 每一帧都需要几张rt在显存中传输、清理等,会更耗带宽
- 4.延迟渲染只能用同一套lighting pass(光照是一起计算的)
|