本章是对前置章节的进一步补充,主要是针对多光源的解析,分为以下几个方面:
(1)、渲染路径 (2)、光照衰减 (3)、阴影 (4)、标准实现的unity shader
1、渲染路径:
主要分为前向渲染、延迟渲染和顶点照明渲染(已经被抛弃)。
我们可以在Player->Graphics->Rendering path来选择项目所需的渲染路径。也可以在camera中选择是用setting做的设置或是选择别的渲染路径。
做完选择后,unity会自动查找shader中tags lightmode中对应的渲染方式所在的pass进行渲染。所有可供选择的lightmode如下:
1.1 前向渲染
前向渲染共分为:逐顶点处理,逐像素处理,球谐函数(SH)处理。
一般base pass会逐像素处理亮度最亮的一个平行光以及逐顶点处理其他光照。add pass最多会处理四个逐像素光照或若干逐顶点、sh光照。当光源设置为important,会被逐像素处理,但是也要根据quality srtting设置的最大逐像素光源数量,不够补齐,多了去除。
add pass 要设置混合 阴影还要设置对应的编译指令。
前向渲染中内置的字段和函数如下:
1.2顶点照明渲染
顶点照明渲染运算性能最高,效果最差。他不支持逐像素才能得到的结果:阴影、法线映射、高精度的高光反射等。实际上,他只是使用了逐顶点的处理方式,他的所有效果都可以在前向渲染中实现。
在unity中,我们可以在一个顶点照明的pass中最多访问到8个逐顶点光源。
内置变量和函数如下:
1.3 延迟渲染
延迟渲染主要是启用了G缓冲,它会存储离摄像机最近的表面。例如:法线、位置、用于光照计算的材质等。
延迟渲染也需要用到两个pass,第一个pass不进行光照计算,仅仅计算哪些片元是可见的,我们就把它存储到G缓冲里。第二个pass使用G缓冲的数据来进行光照计算。
过程如下:
对于延迟渲染,他主要适合场景光源数目很多,使用前向渲染会造成性能瓶颈的时候。在延迟渲染中,其实每个光源都是按照逐像素进行处理的。
但是他也有一些缺点:(1)不支持真正的抗锯齿功能(2)不能处理半透明物体(3)对显卡有要求。
G缓冲包含以下几个渲染纹理:
可用变量和函数如下: