Unity-Shader渲染路径随笔

Unity中Shader中用到的光源可以分为:灯光贴图、环境光、平行光、自发光等。
其中灯光贴图一般由美术来制作处理。
环境光的控制面板在Windows->Lighting 窗口下。在这里我们可以处理环境光的种类,可以使用天空盒子或者纯色。在Unoty中使用天空盒子可以实现HDR效果。另外这里还留了一些用来处理灯光的质量以及渲染方式的配置。
Unity-Shader渲染路径随笔

关于灯光的渲染方式,Unity中主要分为三类:逐像素、逐顶点和球谐函数。三种渲染方式分别对应了不同的灯光渲染质量。拿一个平行光来举例:

Unity-Shader渲染路径随笔

在灯光组件上的Render Mode可以决定该灯光处理的方式。其中Auto选项代表Unity会自动根据项目设置来处理该光照。处理的规则如下:
在Edit -> Project Settings -> Quality 中的 Pixel Light Count 选项中我们可以选定程序中逐像素光源的总数量,这里假设为4。
当Render Mode为Auto 时,如果场景中除此之外的逐像素光源数小于4时,这个光源就会当做逐像素光源处理,否则按照逐顶点光源处理。
设置为Important 时,会将此光源优先当做逐像素光源处理(并不绝对,依然取决于项目设置的Pixel Light Count)
设置为Not Importtant时,该光源会当做逐顶点光源处理。
Unity-Shader渲染路径随笔

要注意我们如果要处理高精度的高光效果时,需要使用逐像素光源。这是因为,模拟高光的效果时,高光区域亮度衰减不是线性函数,而逐顶点光源的结果输出到屏幕上时,那些没有处理到的像素,是用邻近的两个顶点像素值线性插值得来的。这些插值结果都是不准确的。

在Unity中,渲染路径(Randering Path)可以用来决定光照的处理模式,常用的包括前向渲染、延迟渲染、延迟光照和定点渲染等。
其中最重要也是最常用的,就是前向渲染了。
在前向渲染中,我们处理的光源包括灯光贴图、环境光、平行光、自发光等,同时也会处理阴影。

前向渲染 包括两种渲染路径:FowardBase、FowardAdd。在Shader中,我们为一个Pass指定了一个 LightMode 后,还需要添加相应的宏定义才可以拿到正确的光照信息,格式如下:
Unity-Shader渲染路径随笔

Unity-Shader渲染路径随笔

#pragma multi_compile_fwdbase
#pragma multi_compile_fwdadd
是相应的宏定义。

其中FowardBase 会处理一个最重要的逐像素光源,(Unity会根据所有逐像素光源距离某个物体的距离、亮度等参数自动为光源重要性排序)。光照贴图、自发光、环境光、阴影。并且所有的Pass只执行一次。
FowardAdd会处理其余的的逐像素光照和一定数量的逐顶点光照。其余的所有光照,都会按照球谐函数处理。

阴影在前向渲染中的处理主要包括两步,一是投射阴影,另一个是接收阴影。投射阴影需要在在Tags中指定渲染路径为 ShadowCaster。
接收阴影底层依靠 SHADOW_CORRDS 、 TRANSFER_SHADOW 、SHADOW_ATTENTION三个宏定义。

延迟渲染分为两步,在第一步中,会先渲染所需用到的基本信息,并统一存储到G-缓存中。这一步处理的数据包括:顶点位置、法线、顶点颜色等信息。
第二步中,会使用第一步处理的数据结果来进行光照计算和其他计算。
相比FowardAdd,延迟渲染中,会将所有的光源在第一步中处理。然后这些光源只需额外多执行一个Pass就可以全部处理。而FowardAdd每一个光源都要执行一次Pass。

延迟光照是将前向渲染中的光照计算部分全部提取出来,单独计算,计算的方式和延迟渲染类似。
顶点渲染是将所有的光照按照逐顶点方式计算,可以用来提高性能,但是无法模拟高精度高光。

知识点梳理图:
Unity-Shader渲染路径随笔