笔记18 延迟渲染管线介绍

铁名_IronName Lv4

参考:苏格拉没有底。的笔记

渲染路径(Rendering Path)

渲染路径 决定光照的实现方式,当前渲染目标使用光照的流程。

渲染方式

前向渲染(Forward Rendering)

流程为:

  • 待渲染几何体 → 顶点着色器 → 片元着色器 → 渲染目标
  • 在渲染每一帧的时,每一个顶点/片元都要执行一次片元着色器代码,这时需要将所有的光照信息传到片元着色器中。

虽然大部分情况下的光照都趋向于小型化,而且照亮区域也不大,但即便是离这个像素所对应的世界空间的位置很远的光源,光照计算还是会把所有的光源考虑进去的。
简单来说就是不管光源的影响大不大,计算的时候都会把所有光源计算进去,这样就会造成一个很大的浪费。

规则

  • 发生在顶点处理阶段,会计算所有顶点的光照。全平台支持

  • 规则1:最亮的几个光源会被实现为像素光照

  • 规则2:然后就是,最多四个光源会被实现为顶点光照

  • 规则3:剩下的光源会实现为效率较高的球面调谐光照(Spherical Hamanic),这是一种模拟光照

  • 最亮的那盏光一定是像素光照

  • Light的Render Mode是important的光一定是像素光照

  • 如果前面的两条加起来的像素光照小于Quality Setting里的Pixel Light Count(最大像素光照数量),那么从剩下的光源中找出最亮的那几盏光源,实现为像素光照。

  • 最后剩下的光源,按照规则2或3。

  • 在base pass里执行一盏像素光、所有的顶点光和球面调谐光照,并且进行阴影计算。

  • 其余的像素光每盏一个Additional Pass,并且这些pass里没有阴影计算。

  • 场景中看到的阴影,全是base pass里计算出最亮那盏像素光的阴影,其他像素光是不计算阴影的。

补充

  • 最多的光源数可更改:Unity中的在 project setting 中
  • 需要深度信息进行后处理的话,前向渲染需要单独渲染出一张深度图

延迟渲染(Deferred Rendering)

先不计算光照,延迟到最后再一起计算。主要用来解决大量光照渲染的方案,主机/大项目

实质

先不做迭代三角形做光照计算,而是先找出所以可见像素,再去迭代光照。
直接迭代三角形的话,由于大量三角形是看不到的,会造成极大的浪费。

流程

待渲染几何体 → 顶点着色器 → MRT → 光照计算 → 渲染目标

过程可以拆分为两个pass

  • 第一个pass:几何处理通路。首先将场景渲染一次,获取到的待渲染对象的各种几何信息存储到名为G-buffer的缓冲区中,这些缓冲区用来之后进行更复杂的光照计算。
  • 第二个pass:光照处理通路。遍历所有G-buffer中的位置、颜色、法线等参数,执行一次光照计算。

补充

  • UE4默认使用的是延迟管线。在视图模式—缓冲显示—总览,就可以看到所有 G-buffer 的预览
  • Unity的 URP 是不支持延迟渲染的,老管线支持。
  • 延迟渲染不支持透明物体的渲染。因为没有深度信息。延迟渲染中的透明物体渲染方式和前向渲染相同
  • 因为是最后统一计算光照的,所以只能算一个光照模型(如果需要其他光照模型,只能切换 pass)

其他

1、渲染路径的设置

Unity 在 Project Settings 中可以改。每个相机的 Rendering Path 也可以改。

2、TBDR

有两个TBDR,名字一样,内容不同

  • 第一个:是SIGGRAPH2010提出的,作为传统Defferred Rendering的另一种主要改进,分块延迟渲染(Tile-Based Deferred Rendering,TBDR)旨在合理分摊开销(amortize overhead),自SIGGRAPH 2010上提出以来逐渐为业界所了解。基于延迟渲染的优化方式,通过分块来降低带宽内存用量(解决带宽和内存问题)。把整个图像分为很多块,再一块一块的渲染。

  • 第二个:PowerVR基于手机GPU的TBR框架提出的改进,通过HSR减少Overdraw

  • TBDR这个架构是PowerVR提出来的对TBR的一次改进,在TBR的基础上再加了一个Deferred。通过做一些可见性测试来减少Overdraw

  • 涉及手机GPU架构,和延迟渲染没什么关系

  • 这里提到的关于TBR 、PowerVR提出的TBRD,详细的可以看知乎的这篇文章https://zhuanlan.zhihu.com/p/259760974

3、其他渲染路径

延迟光照(Light Pre-Pass / Deferred Lighting)

  • 减少G-buffer占用的过多开销,支持多种光照模型
  • 和延迟渲染的区别:用更少的 buffer 信息,着色计算的时候用的是forward,所以第三步开始都是前向渲染(可以对不同的物体进行不同的光照模型)

Forward+(即 Tiled Forward Rendering,分块正向渲染

  • 减少带宽,支持多光源,强制需要一个preZ

  • 通过分块索引的方式,以及深度和法线信息来到需要进行光照计算的片元进行光照计算。

  • 需要法线和深度的后处理需要单独渲染一个rt出来

  • 强制使用了一个preZ(可以理解为进行了一个深度预计算)

群组渲染(Clustered Rendering)

4、延迟渲染不支持MSAA

  • 延迟渲染管线不支持MSAA:像素已经被光栅化了,所以没法用更大的像素来渲染。

5、不同path下光源shader的编写

详情请看官方文档

6、PreZ(Zprepass)

实际上就是一个深度计算。不同于深度图把深度信息绘制到了一张RenderTexture上,PreZ是用一个pass,只算深度。

具体用途:

  • 大规模草、透明排序

early-z 和 PreZ 的区别

  • early-z,自动的,对面数有要求(硬件自动)
  • PreZ,当early-z失效的时候,或者需要深度图的时候,一种手动代替的方案

-作业-

1、总结延迟渲染管线的优缺点

2、如何优化 (移动端优化技术)

  • 两个TBDR:一个是SIGGRAPH2010上提出的,通过分块来降低带宽内存用量;一个是PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw
  • 标题: 笔记18 延迟渲染管线介绍
  • 作者: 铁名_IronName
  • 创建于 : 2026-03-30 20:08:37
  • 更新于 : 2026-03-31 14:11:37
  • 链接: https://blog.ironname.top/2026/BRPlan/笔记18-技术美术百人计划/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论