图形学进阶——延迟渲染

延迟渲染管线介绍

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

一、渲染路径 Rendering path

决定光照的实现方式。简言之,就是当前渲染目标使用光照的流程

二、渲染方式

1. 正向渲染(Forward Rendering)

主要流程:待渲染几何体——》顶点着色器——》片元着色器——》渲染目标
图形学进阶——延迟渲染_第1张图片
主要规则:

  • 规则一:最亮的几个光源会被实现为逐像素光照
  • 规则二:然后最多的4个光源会被实现为顶点光照
  • 规则三:剩下的光源会被时限为效率较高的球面调谐光照(Spherical Hamanic),这是一种模拟光照

根据视频中的案例分析FrameDebug
图形学进阶——延迟渲染_第2张图片
逐像素光只有4个,是因为Unity中设置了物体收到逐像素光的最大数量
图形学进阶——延迟渲染_第3张图片

2. 延迟渲染(Deferred Rendering)

是为了解决大量光照渲染的方案

原理:不迭代三角形做光照计算,而是先找出能看到的所有像素,再去迭代光照。省去了很多看不到的三角形的光照计算
图形学进阶——延迟渲染_第4张图片
主要流程:待渲染几何体——》顶点着色器——》MRT(多目标渲染,存储信息到Gbuffer)——》光照计算——》渲染目标
图形学进阶——延迟渲染_第5张图片
注:G-buffer中只有带有深度信息的片元属性,那透明的物体怎么处理?

延迟渲染后,最后使用前向渲染的方式去渲染透明的物体
图形学进阶——延迟渲染_第6张图片

3. 不同渲染路径的特性

① 后处理的方式不同
  • 需要深度信息进行后处理时,前向渲染需要先渲染出一张深度图
  • 延迟渲染可以直接用G-buffer中的深度图进行计算
② 着色计算不同
  • 前向渲染不同物体可以使用不同的光照模型
  • 延迟渲染只能使用一个光照模型,不支持多pass
③ 抗锯齿方式不同
  • 前向渲染普遍使用的是MSAA
  • 延迟渲染不支持MSAA 只能用FXAA或者TXAA等

4 . 不同渲染路径的优缺点

图形学进阶——延迟渲染_第7张图片
注:延迟渲染的缺点还有一个是只能使用同一个光照pass

三、其他

1. Unity3d延迟渲染的设置

图形学进阶——延迟渲染_第8张图片
图形学进阶——延迟渲染_第9张图片

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编写

官方文档有更详细的内容
图形学进阶——延迟渲染_第10张图片

6. 关于Zprepass (preZ)

什么是Z-prepass?

z-prepass是一种优化ealy-z的方法

Early-z存在一些问题,比如当物体按照离屏幕由远及近的顺序渲染时,每一个物体的像素依旧会通过深度检测,因此并不会减少像素着色过程。

而z-prepass首先对需要被渲染的物体执行一遍渲染管线,但这个管线的像素着色器不执行任何操作,通过这种方法,借助深度检测机制,将离屏幕最近的物体的深度值写入深度缓冲区。

然后执行第二遍渲染管线,这次的管线使用第一遍渲染产生的深度缓冲区,并利用early-z技术,使得只有与深度缓冲区中深度值相等的被渲染。

Z-prepass与深度图的区别?

Z-prepass是只计算深度信息的pass,而深度图是将深度信息渲染在一张RT上
图形学进阶——延迟渲染_第11张图片

作业

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/

你可能感兴趣的:(笔记)