渲染路径(Rendering Path)决定了光照如何应用到Unity Shader中
在Unity的Edit->Project Settings->Player -> Other Setting ->Rendering Path中选择项目渲染路径 但有时我们希望可以使用多个渲染路径 例如A相机前向渲染 B相机延迟渲染 可以修改设置摄像机渲染路径
标签名 | 描述 |
Always | 不管使用哪中渲染路径,该pass总是会被渲染,但不会计算任何光照 |
ForwardBase | 用于前向渲染。该pass会计算环境光、最重要的平行光、逐顶点/SH光源和Lightmaps |
ForwardAdd | 用于前向渲染。该pass会计算额外的逐像素光源,每个pass对应一个光源 |
Deferred | 用于延迟渲染。该pass会渲染G换种(G-buffer) |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中 |
PrepassBase | 用于遗留的延迟渲染。该pass会渲染法线和高光反射的指数部分 |
PrepassFinal | 用于遗留的延迟渲染。该pass通过合并纹理、光照和自发光来渲染得到最后的颜色 |
Vertex、VertexLMRGBM和VertexLM | 用于遗留的顶点照明渲染 |
前向渲染路径的原理
我们用伪代码来描述前向渲染路径的大致过程:
pass
{
for(each primitive in this model)
{
if(failed in depth test)
{
discard;//如果没有通过深度测试,说明该片元是不可见的
}
else
{
//如果该片元可见 就进行光照计算
float4 color = Shading(materialInfo,pos,normal,lightDir,viewDir);
//更新帧缓冲
writeFrameBuffer(fragment,color);
}
}
}
//对于每个逐像素光源,我们都需要进行上面一次完整的渲染流程
//假设,场景中有N个物体,每个物体受M个光源影响,那么要渲染整个场景N*M个pass
前向渲染路径有3中处理光照(即照亮物体)的方式:逐顶点处理、逐像素处理、球谐函数(Spherical Harmonics,SH)处理。
Unity判断规则:
场景中最亮的平行光总是按逐像素处理
渲染你模式被设置成Not Important的光源,会按逐顶点或者SH处理
渲染模式被设置成Important的光源,会按逐像素处理
如果根据以上规则得到的逐像素光源数量小于Quality Setting中的逐像素光源数量(Pixel Light Count),会有更多的光源以逐像素的方式进行渲染。
名称 | 类型 | 描述 |
_LightColor0 | float4 | 该pass处理的逐像素光源的颜色 |
_WorldSpaceLightPos0 | float4 | _WorldSpaceLightPos0.xyz是该Pass处理的逐像素光源的位置。如果该光源是平行光,那么WorldSpaceLightPos0.wSHI 0,其他光源类型w值为1 |
_LightMatrix0 | float4x4 | 从世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减纹理 |
untiy_4LightPosX0,unity_4LightPosY0,untiy_4LightPosZ0 | float4 | 仅用于Base Pass.前4个非重要的点光源在世界空间中的位置 |
untiy_4LightAtten0 | float4 | 仅用于Base Pass.储存了前4个非重要的点光源的衰减因子 |
untiy_LightColor | half4[4] | 仅用于Base Pass.存储了前4个非重要的点光源的颜色 |
函数名 | 描述 |
float3 WorldSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个空间中的顶点位置,返回世界空间中从该点到光源的光照方向 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有归一化 |
float3 ObjSpaceLightDir(float4 v) | 仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有归一化 |
float3 Shade4PointLights(...) | 仅可用于前向渲染中。计算四个点光源的光照,它的参数是已经打包进矢量的光照数据,通常就是上表中的内置变量,如untiy_4LightPosX0等。前向渲染通常会使用这个函数来计算逐顶点光照 |