US3S4L3——顶点照明渲染路径

顶点照明渲染路径

  1. 顶点照明渲染路径处理光照的方式

    基本思想就是所有的光都按照逐顶点的方式进行计算的,
    在内置渲染管线中,它只会最多记录8个光源的数据,只会将光相关的数据填充到那些逐顶点相关的内置光源变量

  2. 顶点照明渲染路径在哪里进行光照计算:在一个Pass当中按照逐顶点的方式一次性对所有光照去进行计算

  3. 顶点照明渲染路径的内置光照变量和函数

    我们完全可以直接调用内置函数 ShadeVertexLights​ 或 ShadeVertexLightsFull​,就可以完成对所有光源的逐顶点统一计算

注意:顶点照明渲染路径使用场景较少,只做了解

顶点照明渲染路径的方式

顶点照明渲染路径仅仅是前向渲染路径的一个子集,所有在顶点照明渲染路径中能实现的效果都可以在前向渲染路径中实现
它对硬件配置要求最少、运算性能最高,但是效果是最差的,它不支持那些逐像素才能得到的效果,比如阴影、法线纹理、高精度高光反射等
它的基本思想就是所有的光都按照逐顶点的方式进行计算,在内置渲染管线中,它只会最多记录8个光源的数据,会根据光源类型、强度、距离等因素来决定

Unity 中的顶点照明渲染路径只会将光相关的数据填充到那些逐顶点相关的内置光源变量中,意味着我们不能像前向渲染路径中那样使用逐像素相关的内置变量

顶点照明渲染路径在哪里进行光照计算

顶点照明渲染路径进行光照计算,是在 Shader 当中的 Pass​ 渲染通道中进行计算。顶点照明渲染路径通常在一个 Pass​ 当中就可以完成对物体的渲染。

1
2
3
4
5
Pass
{
// 渲染路径为顶点照明是,光模式设置为 Vertex 顶点
Tags { "LightMode" = "Vertex" }
}

在这个 Pass 当中我们会计算我们关心的所有光源对该物体的影响,并且会按照逐顶点的方式一次性对所有光照去进行计算
因此它是 Unity 内置渲染管线当中最快速的渲染路径,并且具有最广泛的硬件支持,只是相对来说渲染效果最差

顶点照明渲染路径的内置光照变量和函数

常用内置光照变量

变量名 类型 描述
unity_LightColor half4[8] 光源颜色,最多8个,光源小于8个时,数组中多出的颜色会默认设置为黑色
unity_LightPosition float4[8] xyz​ 是视角空间中光源的位置。如果光源是平行光,那么 w​ 分量值为0,其他光源类型 w​ 分量值为1
unity_LightAtten half4[8] 光源衰减因子。
如果光源是聚光灯,x​ 分量为 cos(spotAngle2)\cos{(\frac{spotAngle}{2})}y​ 分量为 1cos(spotAngle/4)\frac{1}{cos(spotAngle/4)}
如果是其他类型的光源,x​ 分量为 -1,y​ 分量为1。
z​ 分量是衰减的平方,w​ 分量是光源范围开根号结果
unity_SpotDirection float4[8] 如果光源是聚光灯,值为视角空间的聚光灯位置
如果是其他类型光源,值为 (0,0,1,0)

常用内置光照函数

函数名 描述
float3 ShadeVertexLights(float4 vertex, float3normal) 输入模型空间中的顶点和法线,计算四个逐顶点光源的光照以及环境光。
float3 ShadeVertexLightsFull(float4 v, float3normal, int lightCount, bool spotLight) 输入模型空间中的顶点位置和法线,计算 lightCount​ 个光源的光照以及环境光。
如果 spotLight​ 为 true​,那么这些光源会被当成聚光灯来处理(结果更精准, 但计算更耗时),否则,按点光源处理