延迟渲染管线介绍
百人计划学习链接:【技术美术百人计划】图形 3.4 延迟渲染管线介绍
一、渲染路径 Rendering path
决定光照的实现方式。简言之,就是当前渲染目标使用光照的流程
二、渲染方式
1. 正向渲染(Forward Rendering)
主要流程:待渲染几何体——》顶点着色器——》片元着色器——》渲染目标
主要规则:
- 规则一:最亮的几个光源会被实现为逐像素光照
- 规则二:然后最多的4个光源会被实现为顶点光照
- 规则三:剩下的光源会被时限为效率较高的球面调谐光照(Spherical Hamanic),这是一种模拟光照
根据视频中的案例分析FrameDebug
逐像素光只有4个,是因为Unity中设置了物体收到逐像素光的最大数量
2. 延迟渲染(Deferred Rendering)
是为了解决大量光照渲染的方案
原理:不迭代三角形做光照计算,而是先找出能看到的所有像素,再去迭代光照。省去了很多看不到的三角形的光照计算
主要流程:待渲染几何体——》顶点着色器——》MRT(多目标渲染,存储信息到Gbuffer)——》光照计算——》渲染目标
注:G-buffer中只有带有深度信息的片元属性,那透明的物体怎么处理?
延迟渲染后,最后使用前向渲染的方式去渲染透明的物体
3. 不同渲染路径的特性
① 后处理的方式不同
- 需要深度信息进行后处理时,前向渲染需要先渲染出一张深度图
- 延迟渲染可以直接用G-buffer中的深度图进行计算
② 着色计算不同
- 前向渲染不同物体可以使用不同的光照模型
- 延迟渲染只能使用一个光照模型,不支持多pass
③ 抗锯齿方式不同
- 前向渲染普遍使用的是MSAA
- 延迟渲染不支持MSAA 只能用FXAA或者TXAA等
4 . 不同渲染路径的优缺点
注:延迟渲染的缺点还有一个是只能使用同一个光照pass
三、其他
1. Unity3d延迟渲染的设置
2. 延迟渲染移动端的优化
- 两种TBDR (Tile-Base-Deffered-Rendering 分块式延迟渲染)
一个是SIGGRAPH 2010上提出的,通过分块来降低带宽内存用量
另一个PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw
3. 其他渲染路径
- 延迟光照(Light Pre-Pass/ Deferred Lighting):减少G-buffer占用的过多开销,支持多种光照模型
- Forward+ (即Tiled Forward Rendering,分块正向渲染):减少带宽,支持多光源,强制需要一个preZ
- 群组渲染 Clustered Rendering:带宽相对减少,多光源下效率提升
4. MSAA
一种通过多重采样来抗锯齿的方法
原理是通过增加采样点,把一个像素变成多个像素进行采样
但是延迟渲染中,像素已经被优先光栅化了,所以不能使用MSAA。
但是可以使用FXAA,通过后处理的方式近似抗锯齿
5. 不同path下光源shader编写
官方文档有更详细的内容
6. 关于Zprepass (preZ)
什么是Z-prepass?
z-prepass是一种优化ealy-z的方法
Early-z存在一些问题,比如当物体按照离屏幕由远及近的顺序渲染时,每一个物体的像素依旧会通过深度检测,因此并不会减少像素着色过程。
而z-prepass首先对需要被渲染的物体执行一遍渲染管线,但这个管线的像素着色器不执行任何操作,通过这种方法,借助深度检测机制,将离屏幕最近的物体的深度值写入深度缓冲区。
然后执行第二遍渲染管线,这次的管线使用第一遍渲染产生的深度缓冲区,并利用early-z技术,使得只有与深度缓冲区中深度值相等的被渲染。
Z-prepass与深度图的区别?
Z-prepass是只计算深度信息的pass,而深度图是将深度信息渲染在一张RT上
作业
1. 总结延迟渲染管线的优缺点
优点:大量光照场景的优势明显;去除了不可见像素的光照计算;支持后处理。
缺点:透明物体不能使用;不支持MSAA;占用了大量的显存带宽;只能用一个光照PASS;对显卡有一定的要求
2. 如何优化(移动端优化技术)
- 使用分块式延迟渲染来降低带宽内存用量
- 使用Framebuffer Fetch 来减少采样时的带宽消耗
参考:https://zhuanlan.zhihu.com/p/102134614
https://blog.csdn.net/qq_33901466/article/details/107007439
https://www.bilibili.com/read/cv779019/