什么是渲染路径(rendering path)

  • 渲染路径决定了光照是如何应用到unityshader中。

  • 一般一个项目只使用一种渲染路径:

    image-20230409121105424

    open Editor

    image-20230409121149042

    关闭use defaults即可设置

  • 设置多个渲染路径

    可以在不同相机中设置不同的渲染路径

    image-20230409121409169

  • 如果显卡不支持,unity会自动降一级渲染路径

  • 标签名 描述
    Always 不管使用哪种路径,该pass总是会被渲染,但不会计算光照
    ForwardBase 用于向前渲染,会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps
    ForwardAdd 向前渲染,会计算额外的逐像素光源,每个pass对应一个光源
    Deferred 延迟渲染,渲染G-buffer
    ShadowCaster 把物体的深度信息渲染到阴影纹理映射(shadowmap)或一张深度纹理中
    PrepassBase 遗留的延迟渲染,会渲染法线和高光反射的指数部分
    PrepassFinal 遗留的延迟渲染,通过合并纹理,光照,自发光来渲染最后得到的颜色
    Vertex,VertexLMRGBM,VertexLM 遗留的顶点照明渲染

向前渲染路径(Foward Rendering Path)

1
2
3
Pass{
Tags{"LightMode"="ForwardBase"|"ForwardAdd"}
}

渲染对象的渲染图元并计算两个缓冲区

  • 颜色缓冲区
  • 深度缓冲区:决定是否可见
  • 对于每个逐像素光照都需要单独计算pass,当物体受到多个逐像素光照时,就要计算多个pass,N(物体数量)*M(逐像素光照)
  • 三种处理光照的方式:逐顶点处理,逐像素处理,球谐函数(SH)处理

unity渲染优先级

  • 最亮的平行光按照逐像素处理

  • 渲染模式为Not Important的使用逐顶点和SH渲染。

  • Important使用逐像素

  • 在以上规则后逐像素光源数量小于Quailty Setting 中的Pixel Light Count,则会有更多光源以逐像素处理

    image-20230409123348674

两种pass的标签和渲染设置以及常规光照计算

  • #pragma multi_compile_fwdbase
    #pragma multi_compile_fwdadd
    只有为两个pass使用这两个编译指令,才可以在pass中得到正确的光照变量,比如光照衰减值。
    
  • Base Pass可实现的光照效果:光照纹理,环境光,自发光,阴影(平行光阴影)

  • Add Pass默认没有阴影,可以使用#pragma multi_compile_fwdadd_fullshadows为点光源和聚光灯开启阴影。

  • Add Pass中需要开启混合模式,否则会覆盖,一般选择Blend One One

内置的光照变量和函数

向前渲染可以使用的内置光照变量

名称 类型 描述
_LightColor0 float4 逐像素光源颜色
_WorldSpaceLightPos0 float4 _WorldSpaceLightPos0.xyz是光源位置,如果是平行光,_WorldSpaceLightPos0.w为0,否则为1
_LightMatrix0 float4x4 世界空间到光源空间的变换矩阵,可以用于采样cookie和光强衰减纹理
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, float4 仅用于base pass,前4个非重要点光源在世界空间的位置
unity_4LightAtten0 float4 仅用于base pass,前4个非重要点光源的衰减因子
unity_LightColor half4[4] 仅用于base pass,前4个非重要点光源的颜色

向前渲染的内置光照函数

函数名 描述
float3 WorldSpaceLightDir(float4 v) 仅向前渲染,输入模型空间的顶点位置,返回世界空间中 点到光源的方向,未归一
float3 UnityWorldSpaceLightDir(float4 v) 仅向前渲染,输入世界空间的顶点位置,返回世界空间中 点到光源的方向,未归一
float3 ObjSpaceLightDir(float4 v) 仅向前渲染,输入模型空间的顶点位置,返回模型空间中 点到光源的方向,未归一
float3 Shade4PointLights(…) 仅向前渲染,计算4个点光源的光照。

延迟渲染路径(Deferred Rendering Path)

unity 5.0后新的延迟渲染替代旧的延迟渲染

原理:包含两个pass

第一个pass:只执行一次,不进行光照计算,仅计算可见性,通过深度缓冲技术实现。如果可见,则将各类信息存入G缓冲当中。

第二个pass利用G缓冲的信息,进行真正的光照。

延迟渲染的效率不依赖场景的复杂度,而是与屏幕空间的大小有关。

unity中的延迟渲染

适合场景光源较多的情况,如果使用向前渲染会造成性能瓶颈。

每个光源都可以当做逐像素处理。

缺点:

  • 不支持真正的抗锯齿
  • 不能处理半透明
  • 对显卡有要求:支持MRT,Shader Mode3.0以上,深度渲染纹理和双面模板缓冲。

默认的G缓冲区包含

  • RT0,格式为ARGB32,RGB用于存储漫反射颜色,A通道未利用
  • RT1,格式为ARGB32,RGB用于存储高光反射颜色,A通道存放高光反射指数
  • RT2,格式为ARGB2101010,RGB存放法线,A未利用
  • RT3,格式为ARGB32(非HDR)或ARGBHalf(HDR),用于存储自发光+lightmap+反射探针
  • 深度缓冲和模板缓冲

可使用的内置变量

名称 格式 描述
_LightColor float4 光源颜色
_LightMatrix0 float4x4 世界空间到光源空间的变换矩阵,用于采样cookie和光照衰减纹理

顶点照明路径(Vertex Lit Rendering Path)

unity 5.0后被抛弃

配置要求最少,性能最高,效果最差。P185