Unity Shader学习笔记(12)渲染路径(Rendering Path)

发表于2017-12-29
评论1 4.4k浏览
Unity支持不同的渲染路径,并且不同的渲染路径有不同的特点和性能特点,在介绍渲染路径的同事并分别给大家介绍什么是顶点照明渲染路径和延迟渲染路径(Deferred)。

渲染路径

决定了光照如何应用到Unity Shader中。

Pass块内可选择的渲染路径: 

前向渲染路径(Forward)

  是传统的渲染方式。 
原理:渲染该对象的渲染图元,计算两个缓冲区信息(颜色缓冲区、深度缓冲区)。利用深度的缓冲判断片元是否可见,可见就更新颜色缓冲,否则就丢弃。 
  如果有N个物体受M个光源影响就需要N*M个Pass。渲染引擎通常会限制每个物体的逐像素光照数目。

三种处理光照方式: 
- 逐顶点处理。 
- 逐像素处理。 
- 球谐函数(Spherical Harmonics, SH)处理。

Unity使用的判断规则: 
- 场景中最亮的平行光按逐像素处理。 
- Render Mode 为 Not Important的光源,会逐顶点或者SH处理。 
- Render Mode 为 Important的光源,会逐像素处理。 
- 如果上面得到的逐像素光源小于Quality Setting中的逐像素光源数量,会有过更多光源以逐像素的方式进行渲染。

前向渲染两种Pass: 
- Base Pass。一般一个Unity Shader定义一个(双面渲染的话两个),执行一次。 
- Additional Pass。如果有N个光源影响该物体,就会执行N次。

前向渲染可以使用的内置光照变量和函数: 


顶点照明渲染路径(Vertex)

  即逐顶点计算光照。硬件配置要求最低,运算性能最高,效果最差的类型,不支持逐像素效果(如:阴影、法线映射、高精度高光反射等)。

顶点照明渲染可以使用的内置变量和函数: 


延迟渲染路径(Deferred)

  使用额外的缓冲区(G缓冲,Geometry-buffer),存储离摄像机最近的表明的其他信息(表面法线、位置、材质属性等)。避免前向渲染在大量实时光照下时的性能急速下降。实现就用两个Pass,与场景光源数目无关,而是和屏幕空间大小有关。

主要包含两个Pass: 
1. 第一个Pass:只计算哪些片元可见(深度缓冲技术),可见的就存到G缓冲中。 
2. 第二个Pass:利用G缓冲中的片元信息,计算光照。

缺点: 
- 不支持真正的抗锯齿(anti-aliasing)功能。 
- 不能处理半透明物体。 
- 显卡必须支持MRT(Multiple Render Targets)、Shader Mode3.0及以上、深度渲染纹理以及双面的模版缓冲。

G缓冲区所包含的渲染纹理: 

延迟渲染可以使用的内置变量: 

Unity Shader学习笔记系列教程:

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引