1、前向渲染路径处理光照的方式
前向渲染路径中会将光源分为以下3种处理方式:
- 逐像素处理(需要高等质量处理的光)
- 逐顶点处理(需要中等质量处理的光)
- 球谐函数(SH)处理(需要低等质量处理的光)
球谐函数处理光照的方式是将光照场景投影到球谐函数的空间中,通过一组球谐系数来表示光照。
内存换性能,细节表现效果差(不需要我们自己书写,Unity底层会帮助我们进行处理)
场景当中的各种光源将采用哪种方式处理?
在前向渲染中,一部分最亮的灯光以逐像素处理,然后4个点光源以逐顶点方式处理,其余的灯光以SH处理
一个光源是逐像素、逐顶点还是SH处理主要取决于以下几点:
- 渲染模式设置为Not Important(不重要)的灯光始终以逐顶点或者SH的方式渲染
- 渲染模式设置为Important(重要)的灯光始终是逐像素渲染
- 最亮的平行光总是逐像素渲染
- 如果逐像素光照的灯光数量少于项目质量设置中的Pixel Light Count(像素灯光计数)的数量,那么其余比较亮的灯光将会被逐像素渲染
注意:如果灯光渲染模式设置为Auto(自动),Unity会根据灯光的亮度以及与物体的距离自动判断重要性
前向渲染路径处理光照的方式
Unity当中有一套划分光源“三六九等”的规则,主要通过 灯光渲染模式、项目质量设置中的像素灯光计数的数量、光照强度、距离物体距离来综合判定
在前向渲染路径中,会将光源分成所谓的逐像素、逐顶点、SH三种处理类型,有了对光源的“高中低”的身份认知,Unity底层就可以将这些光源的数据存储到Shader中对应的内置变量中,我们就可以通过这些内置变量获取到对应“身份”的光源数据,从而进行差异化的处理
2、前向渲染路径在哪里进行光照计算
要进行光照计算,那肯定是在Shader当中的Pass渲染通道中进行计算。但是对于前向渲染来说,有两种Pass可以用来进行光照处理:
(1)Base Pass(基础渲染通道)
渲染物体的主要光照通道,用于处理主要的光照效果,主要用于计算逐像素的平行光以及所有逐顶点和SH光源
可实现的效果:漫反射、高光反射、自发光、阴影、光照纹理等
(2)Additional Pass(附加渲染通道)
渲染物体额外的光照通道,用于处理一些附加的光照效果,主要用于计算其他影响物体的逐像素光源,每个光源都会执行一次该Pass
可实现的效果:描边、轮廓、辉光等
对于一个前向渲染路径下的Unity Shader,通常会定义一个Base Pass(基础渲染通道)以及一个Additional Pass(附加渲染通道)
每次渲染时,一个Base Pass仅会执行一次(多个Base Pass情况除外)主要用于渲染环境光或自发光等
而一个Additional Pass会根据影响该物体的其他逐像素光源的数量被多次调用,每个逐像素光源都会调用一次Additional Pass,由于开启了混合,渲染结果会和之前的光照颜色进行混合
注意:
- Base Pass也可以有多个,比如需要双面渲染的情况
- Base Pass默认支持阴影, Additional Pass默认不支持,可以通过添加#pragma multi_compile_fwdadd_fullshadows编译指令开启阴影
- 这些Pass当中我们具体处理光照的方式是由我们自己决定的,使用逐顶点光照还是逐像素光照的计算方式,都根据我们的具体实现而定,前文提到的逐像素光源只是按照期望处理类型来分的而已
简而言之:
Base Pass(基础渲染通道):
主要用于处理影响该物体的一个高质量光源(如平行光)、所有中(逐顶点处理)低质量(SH处理)光源 等
Additional Pass(附加渲染通道):
主要用于处理影响该物体的除平行光以外的其它高质量光源(每个高质量光源都会调用)
3、前向渲染路径的内置光照变量和函数
常用内置光照变量
常用内置光照函数
通过这些内置光照变量,我们便可以获取到前向渲染路径当中,对渲染质量有不同要求的光源们的相关数据。
只需要利用这些数据和函数在Base Pass(基础渲染通道)和 Additional Pass(附加渲染通道)中按照需求进行相关的逻辑处理即可