——内容源自唐老狮的shader课程
目录
1.是什么
2.LightMode标签
3.前向渲染路径(Forward)
3.1.处理光照的方式
3.2.处理各种光源的方式
3.3.在哪里进行光照计算
4.顶点照明渲染路径(Vertex)
5.延迟渲染路径(Deferred)
5.1.处理光照的方式
5.2.在哪里进行光照计算
5.3.内置光照变量
6.对比
6.1.光源的渲染
6.2.Pass
6.3.优缺点
7.如有疏漏,还请指出
1.是什么
其决定了光照如何应用到Unity Shader中,不同渲染路径获取光源数据的流程不同。因此若想要获取正确的光照,就需要对每个Pass设置其对应的渲染路径。
2.LightMode标签
LightMode渲染标签是用来指明该Pass匹配的渲染路径是哪种的,它通常需要和Camera中的Rendering Path匹配,用于指定Pass在渲染过程中的哪个阶段
LightMode的值有如下几种:
Always:不管使用哪种渲染路径,该Pass始终渲染,但不会计算任何光照
ForwardBase:前向渲染路径的基础照明阶段执行的Pass,它会计算环境光,重要的平行光,逐顶点/SH光源和Lightamps
ForwardAdd:前向渲染路径的额外照明阶段执行的Pass,它会计算额外的逐像素光源,每个Pass对应一个光源
Deferred:延迟渲染路径中执行的Pass,用于几何阶段之后执行光照计算,该Pass会渲染到G缓存(G-buffer)中
ShadowCaster:用于生成阴影图的Pass,通常用于阴影投射,把物体的深度信息渲染到阴影纹理或一张深度纹理中
MotionVectors:用于生成运动矢量的Pass,通常用于动态模糊
Meta:用于在渲染对象元数据时执行的Pass
3.前向渲染路径(Forward)
3.1.处理光照的方式
主要有三种:
逐像素处理:需要高等质量的光
逐顶点处理:需要中等质量的光
球谐函数(SH)处理:需要低等质量的光。它会将光照场景投影到球谐函数的空间中,通过一系列球谐函数来表示光照。用内存换性能,细节表现效果差
3.2.处理各种光源的方式
在前向渲染中,一部分最亮的灯光以逐像素处理,然后4个点光源以逐顶点方式处理,其余灯光以SH处理。而一个光源究竟是什么处理取决于以下几点:
(1)渲染模式设置为Not Important的光源始终以逐顶点或者SH的方式渲染
(2)渲染模式设置为Important的光源始终以逐像素渲染
(3)最亮的平行光总是逐像素渲染(当太阳使)
(4)如果逐像素光照的灯光数量小于项目质量设置中的Pixel Light Count(像素灯光计数)的数量,那么其余比较亮的灯光将会被逐像素渲染 (超过4个可能会被丢弃)
(5)如果灯光渲染模式为Auto,Unity会根据灯光亮度以及物体的距离自动判断其重要性
unity一般还会将不同灯光组之间重叠,即同一个光源以多种方式处理。以解决不同渲染模式的光源衔接时会出现瑕疵的问题
3.3.在哪里进行光照计算
Pass通道中,有两种Pass可以来进行前向光照渲染的光照处理
Base Pass(基础光照通道,对应LightMode为ForwardBase)
它是渲染物体的主要通道,用于处理主要的光照效果,主要用于计算逐像素的平行光和所有逐顶点以及SH光源。可以有多个
默认支持阴影
可用来实现漫反射,高光反射,自发光,阴影,光照纹理等
Additional Pass(附加渲染通道,对应LightMode为ForwardAdd,混合一般为one one)
是渲染物体额外的光照通道,用于处理一些附加的关照效果,主要用于计算所有除了平行光以外影响该物体的逐像素光源,每个光源都会执行一次该Pass
它默认不支持阴影,需要添加 #pragma multi_compile_fwdadd_fullshadows 来开启阴影
可用来实现描边,轮廓,辉光等
对于一个物体,一个Base Pass只会执行一次,但Additional Pass会根据影响该物体的其他逐像素光源而被多次调用。且每个逐像素光源都会调用一次Addtional Pass
虽然但是,具体处理光照的方式还是我们自己来搞的
4.顶点照明渲染路径(Vertex)
在Pass里将LightMode设置为Vertex即可。通常只需要一个Pass,它会将所有光照一次性按逐顶点的方式计算。
其硬件要求最低,性能最高,效果最差,不支持逐像素
5.延迟渲染路径(Deferred)
5.1.处理光照的方式
光照的数量无限制,并且都可以使用逐像素来渲染,支持法线纹理,阴影等效果的处理,但不能处理半透明物体,也不支持真正的抗锯齿,这些会自动使用前向渲染路径
延迟渲染的效率不取决于场景复杂度,而是与我们使用的屏幕空间的大小有关。原因是延迟渲染路径除了使用颜色缓冲和深度缓冲外,还会使用一个叫G缓存的额外缓存区来存储我们关心的表面(通常是离摄像机最近的表面)的其他信息,如表面的法线,位置,材质属性等。这些缓存区可以理解为一张张的2D图片,我们实际上是在对这些图片进行处理
5.2.在哪里进行光照计算
同样是Pass通道,主要包含两个Pass
第一个Pass:主要判断哪些片元可见,并将可见片元的信息存储到G缓存区中,如表面法线,视角向量,漫反射系数等。该Pass通常无需我们自己实现,且对于每个物体,该Pass只会执行一次
第二个Pass:利用G缓存区中各个片元的相关信息进行真正的相关计算,最终将颜色写入到颜色缓冲区中。使用这个需要将LightMode设置为Deferred。而且这个Pass默认情况下只能Unity内置的标准光照模型进行计算
5.3.内置光照变量
需要包含UnityGBuffer.cginc
sampler2D _CameraGBufferTexture0(1, 2, 3...)
这些变量是自定义变量,第一个Pass的数据会存在它们中。0为漫反射颜色(RGB),遮挡(A);1为镜面反射颜色(RGB),粗糙度(A);2为世界空间法线(RGB),未使用(A);3为发射 + 光照 + 光照贴图 + 反射探针缓冲区;4为光照遮挡值(RGBA)
6.对比
6.1.光源的渲染
前向:先划分等级,再渲染
顶点:都按逐顶点,最多八个
延迟:都可逐像素渲染,光源数量无限制,不能处理半透明物体,不支持真正的抗锯齿
6.2.Pass
前向:Base:处理一个平行光,所有中低质量光源
Additional:除平行光之外的所有高质量
顶点:一个Pass按逐顶点处理一次性处理所有光源
延迟:第一个Pass:判断哪些片元可见,并将可见光源信息存储到G缓存
第二个Pass:利用G缓存信息进行计算,最终将颜色写入
6.3.优缺点
前向:优:适用于相对简单的场景和较少数量的光源,基本可以实现任何渲染效果
缺:复杂场景和大量光源情况下开销大
顶点:优:性能开销小
缺:效果垃圾
延迟:优:适用于复杂场景和大量光源,能有效减少光照计算的开销
缺:对于透明物体和一些特殊效果不饿能直接支持,需要复杂的处理