本节笔记大部分摘选于《Unity Shader入门精要》
在Unity里,渲染路径决定了光照是如何应用到Unity Shader中的,换句话说,只有设置了正确的渲染路径,Shader的光照计算才可以被正确执行。
目前的Unity支持两种渲染路径,兼容一种渲染路径。
支持的两种是:前向渲染路径和延迟渲染路径
兼容的一种是:顶点照明渲染路径(5.0之后已经弃用了)
LightModel的设置标签如下:
标签名 描述 | |
---|---|
Always | 不管使用哪种渲染路径,该Pass总是会被渲染,但不会计算任何光照 |
ForwardBase | 用于前向渲染,该Pass会计算环境光、最重要的平行光、逐顶点/SH光源和Lightmaps |
ForwardAdd | 用于前向渲染,该Pass会计算额外的逐像素光源,每一个Pass对应一个光源 |
Deferred | 用于延迟渲染,该Pass会渲染G缓冲 |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理或者一张深度纹理中 |
PrePassBase | 用于遗留的延迟渲染,该pass会渲染法线和高光反射的指数部分 |
PrePassFinal | 用于遗留的延迟渲染,该pass通过合并纹理、光照和自发光来渲染得到最后的颜色 |
Vertex、VertexLMRGBM和VertexLM | 用于遗留的顶点照明渲染 |
以上是每一个Pass都应该设置的路径标签,都有着不同的作用,在这之后会挑选常用的解释。
前向渲染路径
前向渲染路径是非常常用的一种渲染方式。
每进行一次完整的前向渲染,我们需要渲染该对象的渲染图元,并计算两个缓冲区的信息:一个是颜色缓冲区,一个是深度缓冲区。
如果一个物体在多个逐像素光源的影响区域内,那么该物体就需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后在帧缓冲中把这些光照结果混合起来得到最终的颜色值。
在Unity中,前向渲染路径有三种处理光照的方式:逐顶点处理,逐像素处理和球谐函数(SH)处理。 而决定一个光源使用哪种处理模式取决于它的类型和渲染模式。光源类型指的是该光源是平行光还是其他类型的光源,而光源的渲染模式是指该光源是否是重要的(是否设置为Important)
在前向渲染中,当我们渲染一个物体时,Unity会根据场景中各个光照的设置以及这些光源对物体的影响程度,对这些光源进行一个重要度排序。其中,一定数目的光源会按照逐像素方式处理,然后最多有4个光源按照逐顶点方式处理,剩下的光源可以按照SH方式处理。
Unity的判断规则如下:
1.场景中最亮的平行光总是按照逐像素处理的
2.渲染模式被设置成Not Important的光源,会按照逐顶点或者SH处理。
3.渲染模式被设置成Important的光源,会按照逐像素处理
4.如果根据以上规则得到的逐像素光源小于Qulity Setting中的逐像素光源数量,那么会有更多的光源按照逐像素的方式进行渲染。
关于BasePass和Additional Pass之间的相关性如下:
1.除了设置Pass的标签之外,还需要使用 #pragma multi_compile_fwdbase,这些编译指令会保证Unity可以为相应类型的Pass生成一些需要的Shader变种。
2.Base Pass中渲染的平行光默认是支持阴影的,而Additional Pass中渲染的光源在默认情况下是没有阴影效果的。
3.环境光和自发光也是在BasePass中计算的。这是因为,对于一个物体来说,环境光和自发光我们只希望计算一次即可。
4.在Additional Pass中我们还开启了混合效果,因为我们希望每个Additional Pass可以与上一次的光照结果在帧缓存中进行叠加,从而得到最终的有多个光源的渲染效果。
5.对于前向渲染来说,一般情况下Base Pass仅会运行一次而Additional Pass会根据逐像素光源的数目而多次调用。
注:关于前向渲染中可以使用的内置变量和函数表详细请查阅Unity官方文档
延迟渲染路径
延迟渲染路径主要应用于当场景中包含大量实时光源的时候,前向渲染的性能会急速下降的情况。
除了前向渲染中的使用的颜色缓冲和深度缓冲之外,延迟渲染还会立用额外的缓冲区,这些缓冲区也被统称为G缓冲。G缓冲区存储了我们所关心的表面的其他信息,比如法线,位置,用于光照计算的材质属性等。
延迟渲染的原理:
延迟渲染主要包含两个Pass: 在第一个Pass之中,我们不进行任何的光照计算,而是仅仅计算哪些片元是可见的,这主要是通过深度缓冲技术来实现的。 当我们法线一个片元是可见的时候,我们就把他的相关信息存储到G缓冲区中。然后,在第二个Pass中,我们利用G缓冲区中的各个片元信息,例如表面法线、视角方向、漫反射系数等,进行真正的光照计算。
延迟渲染路径有以下的缺点:
1.不支持真正的抗锯齿功能
2.不能处理半透明物体
3.对显卡有一定要求,显卡必须支持MRT,Shader Mode3.0以上,深度渲染纹理以及双面的模板缓冲。
补:Unity中有三种光源类型:点光源,聚光源和平行光,其中平行光的基本属性只有方向。点光源和聚光源拥有位置,方向,衰减等特性。
而Unity中处理衰减的方式是通过一张光照衰减纹理来实现的。