shader学习之路——Unity渲染路径之前向渲染路径

渲染路径(Rendering Path)决定了光照如何应用到Unity Shader中

在Unity的Edit->Project Settings->Player -> Other Setting ->Rendering Path中选择项目渲染路径     但有时我们希望可以使用多个渲染路径 例如A相机前向渲染   B相机延迟渲染   可以修改设置摄像机渲染路径

LightMode标签支持的渲染路径设置选项
标签名描述
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),会有更多的光源以逐像素的方式进行渲染。

前向渲染可以使用的内置光照变量
名称类型描述
_LightColor0float4该pass处理的逐像素光源的颜色
_WorldSpaceLightPos0float4_WorldSpaceLightPos0.xyz是该Pass处理的逐像素光源的位置。如果该光源是平行光,那么WorldSpaceLightPos0.wSHI 0,其他光源类型w值为1
_LightMatrix0float4x4从世界空间到光源空间的变换矩阵。可以用于采样cookie和光强衰减纹理
untiy_4LightPosX0,unity_4LightPosY0,untiy_4LightPosZ0float4仅用于Base Pass.前4个非重要的点光源在世界空间中的位置
untiy_4LightAtten0float4仅用于Base Pass.储存了前4个非重要的点光源的衰减因子
untiy_LightColorhalf4[4]仅用于Base Pass.存储了前4个非重要的点光源的颜色
前向渲染可以使用的内置光照函数
函数名描述
float3 WorldSpaceLightDir(float4 v)仅可用于前向渲染中。输入一个空间中的顶点位置,返回世界空间中从该点到光源的光照方向
float3 UnityWorldSpaceLightDir(float4 v)仅用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有归一化
float3 ObjSpaceLightDir(float4 v)仅可用于前向渲染中。输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向。没有归一化
float3 Shade4PointLights(...)仅可用于前向渲染中。计算四个点光源的光照,它的参数是已经打包进矢量的光照数据,通常就是上表中的内置变量,如untiy_4LightPosX0等。前向渲染通常会使用这个函数来计算逐顶点光照

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值