Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

前向渲染路径

一、前向渲染路径处理光照的方式

1.主要三种方式

  • 逐像素处理(需要高等质量处理的光)
  • 逐顶点处理(需要中等质量处理的光)
  • 球谐函数(SH)处理(需要低等质量处理的光) 球谐函数处理光照的方式,是将光照场景投影到球谐函数空间中,通过一组球谐系数来表示光照。 是一种通过内存换性能的方式,细节表现效果较差(不需要我们自己书写,Unity 底层会帮我们进行处理)

2.场景中的各种光源将采用哪一种方式处理

在前向渲染中,一部分最亮的灯光以逐像素处理,然后 4 个点光源(可在 project Setting --> Quality 中更改),以逐顶点方式处理,其余灯光以 SH 处理 Snipaste_2024-09-18_16-03-41.png

一个光源是如何处理的主要取决于如下点

  1. 渲染模式设置为 Not Important 的灯光始终以逐顶点或者 SH 的方式渲染
  2. 渲染模式设置为 Important 的灯光始终是逐像素渲染
  3. 渲染模式设置为 Auto 的灯光,Unity 会根据灯光的亮度以及物体的距离自动判断重要性
  4. 最亮的平行光总是以逐像素渲染
  5. 如果过逐像素灯光的数量少于 project Setting --> Quality 中的 Pixel Light Count 数量,那么其余比较亮的灯光将会被逐像素渲染
Snipaste_2024-09-18_16-02-53.png

二、前向渲染路径在哪里进行光照计算

1.前向渲染路径渲染位置

进行光照计算,主要是在 Shader 中的 Pass 渲染通道中进行计算。 但是对于向前渲染来说,有两种 Pass 可以处理主要的光照效果

  1. Bass Pass(基础渲染通道) 渲染物体的主要光照通道,用于处理主要的光照效果 主要用于计算逐像素的平行光和所有逐顶点和 SH 光源 可实现效果:漫反射,高光反射,自发光,阴影,光照纹理 Tags{"LightMode" = "ForwardBase"}
  2. Addtional Pass(附加渲染通道) 渲染物体额外的光照通道,用于处理一些附加的光照效果 主要用于计算其他影响的物体的逐像素光源 每一个光源都会执行一次该 Pass 可以实现效果:描边,轮廓,辉光 Tags{"LightMode" = "ForwardAdd"}

注意:

  1. Base Pass 也可以有多个,比如需要双面渲染的情况
  2. Base Pass 默认支持阴影,Additional Pass 默认不支持阴影(可以通过添加#progma multi_compile_fwdadd_fullshadows编译指令开启阴影)
  3. 这些 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_相关参数,都是非重要的点光源相关数据。可以用它来计算逐顶点光照。返回值是四个点光源的叠加颜色

评论