Unity Shader学习笔记(12)渲染路径(Rendering Path)
决定了光照如何应用到Unity Shader中。
Pass块内可选择的渲染路径:
是传统的渲染方式。
原理:渲染该对象的渲染图元,计算两个缓冲区信息(颜色缓冲区、深度缓冲区)。利用深度的缓冲判断片元是否可见,可见就更新颜色缓冲,否则就丢弃。
如果有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次。
前向渲染可以使用的内置光照变量和函数:
即逐顶点计算光照。硬件配置要求最低,运算性能最高,效果最差的类型,不支持逐像素效果(如:阴影、法线映射、高精度高光反射等)。
顶点照明渲染可以使用的内置变量和函数:
使用额外的缓冲区(G缓冲,Geometry-buffer),存储离摄像机最近的表明的其他信息(表面法线、位置、材质属性等)。避免前向渲染在大量实时光照下时的性能急速下降。实现就用两个Pass,与场景光源数目无关,而是和屏幕空间大小有关。
主要包含两个Pass:
1. 第一个Pass:只计算哪些片元可见(深度缓冲技术),可见的就存到G缓冲中。
2. 第二个Pass:利用G缓冲中的片元信息,计算光照。
缺点:
- 不支持真正的抗锯齿(anti-aliasing)功能。
- 不能处理半透明物体。
- 显卡必须支持MRT(Multiple Render Targets)、Shader Mode3.0及以上、深度渲染纹理以及双面的模版缓冲。
G缓冲区所包含的渲染纹理:
延迟渲染可以使用的内置变量: