前向渲染路径
一、前向渲染路径处理光照的方式
1.主要三种方式
- 逐像素处理(需要高等质量处理的光)
- 逐顶点处理(需要中等质量处理的光)
- 球谐函数(SH)处理(需要低等质量处理的光) 球谐函数处理光照的方式,是将光照场景投影到球谐函数空间中,通过一组球谐系数来表示光照。 是一种通过内存换性能的方式,细节表现效果较差(不需要我们自己书写,Unity 底层会帮我们进行处理)
2.场景中的各种光源将采用哪一种方式处理
在前向渲染中,一部分最亮的灯光以逐像素处理,然后 4 个点光源(可在 project Setting --> Quality 中更改),以逐顶点方式处理,其余灯光以 SH 处理 
一个光源是如何处理的主要取决于如下点
- 渲染模式设置为 Not Important 的灯光始终以逐顶点或者 SH 的方式渲染
- 渲染模式设置为 Important 的灯光始终是逐像素渲染
- 渲染模式设置为 Auto 的灯光,Unity 会根据灯光的亮度以及物体的距离自动判断重要性
- 最亮的平行光总是以逐像素渲染
- 如果过逐像素灯光的数量少于 project Setting --> Quality 中的 Pixel Light Count 数量,那么其余比较亮的灯光将会被逐像素渲染
二、前向渲染路径在哪里进行光照计算
1.前向渲染路径渲染位置
进行光照计算,主要是在 Shader 中的 Pass 渲染通道中进行计算。 但是对于向前渲染来说,有两种 Pass 可以处理主要的光照效果
- Bass Pass(基础渲染通道) 渲染物体的主要光照通道,用于处理主要的光照效果 主要用于计算逐像素的平行光和所有逐顶点和 SH 光源 可实现效果:漫反射,高光反射,自发光,阴影,光照纹理
Tags{"LightMode" = "ForwardBase"} - Addtional Pass(附加渲染通道) 渲染物体额外的光照通道,用于处理一些附加的光照效果 主要用于计算其他影响的物体的逐像素光源 每一个光源都会执行一次该 Pass 可以实现效果:描边,轮廓,辉光
Tags{"LightMode" = "ForwardAdd"}
注意:
- Base Pass 也可以有多个,比如需要双面渲染的情况
- Base Pass 默认支持阴影,Additional Pass 默认不支持阴影(可以通过添加
#progma multi_compile_fwdadd_fullshadows编译指令开启阴影) - 这些 Pass 当中具体处理光照的方式是由我们自己决定的,使用逐顶点光照还是逐像素光照的计算方式,是根据我们具体实现而定的,前文提到的逐像素光源只是按照期望处理类型来分的而已
三、前向渲染路径的内置光照变量和函数
1.常用的内置光照变量
| 变量名 | 类型 | 描述 |
|---|---|---|
| _LightColor0 | float4 | 该 Pass 当前处理的逐像素(高质量)光源的颜色 |
| _WorldSpaceLightPos0 | float4 | _WorldSpaceLightPos0.xyz 表示该 Pass 当前处理的逐像素(高质量)光源的位置,如果该光源的平行光那么_WorldSpaceLightPos0.w 是 0,其他光源类型为 1 |
| unity_4LightPosX0 unity_4LightPosY0 unity_4LightPosZ0 |
float4 | 仅用于 Bace Pass 前四个非重要点光源在世界空间中的位置 |
| unity_4LightAtten0 | float4 | 仅用于 Bace Pass 存储了前四个非重要的点光源的衰减因子 |
| unity_LightColor | float4[4] | 仅用于 Bace Pass 存储了前四个非重要的点光源的颜色 |
2.常用的光照光照函数
| 函数名 | 返回值 | 描述 |
|---|---|---|
| WorldSpaceLightDir(float4 v) | float3 | 仅用于前向渲染路径中 输入模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向 结果没有归一化 |
| UnityWorldSpaceLightDir(float4 v) | float3 | 仅用于前向渲染路径中 输入世界空间中的顶点位置,返回世界空间中该点到光源的光照方向。 结果没有归一化 |
| ObjSpaceLightDir(float4 v) | float3 | 仅用于前向渲染路径中 输入模型空间中的顶点位置,返回模型空间中的该点到光源的光照方向 结果没有归一化 |
| Shader4PointLights(float4 lightPosX,float4 lightPosY,float4 lightPosZ,float3 lightColor0,float3 lightColor1,float3 lightColor2,float4 lightAttenSq,float3 pos,float3 normal) | float3 | 仅用于前向渲染路径中 参数非常多,主要就是 Unity_相关参数,都是非重要的点光源相关数据。可以用它来计算逐顶点光照。返回值是四个点光源的叠加颜色 |