1、Unity的渲染路径
主要有3种:前向渲染路径、延迟渲染路径、顶点照明渲染路径
摄像机单独设置,若选择User Player Settings,则摄像机会使用Project Settings的设置;否则覆盖掉Project Settings的设置
,若当前显卡并不支持所选择的路径,则Unity会使用更低一级的渲染路径。
标签名 | 描述 |
Always | 不管使用哪种渲染路径,该Pass总是会被渲染,而不计算任何光照 |
ForwardBase | 用于前向渲染,该Pass会计算环境光、最重要的平行光、逐顶点/SH光源和Lightmaps |
ForwardAdd | 用于前向渲染,该Pass会计算额外的逐项素光源,每个Pass对应一个光源 |
Deferred | 用于延迟渲染,该Pass会渲染G缓冲(G-buffer) |
ShadowCaster | 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中 |
PrepassBase | 用于遗留的延迟渲染,该Pass会渲染法线和高光反射的指数部分 |
PrepassFinal | 用于遗留的延迟渲染,该Pass通过合并纹理、光照和自发光来渲染得到的最后的颜色 |
Vertex、VertexLMRGBM和VertexLM | 用于遗留的顶点照明渲染 |
1.1 前向渲染路径
前向渲染的原理
每进行一次完整的前向渲染,我们需要渲染该对象的渲染图元并计算两个缓冲区的信息:颜色缓冲区和深度缓冲区
伪代码:
Pass{
for(each primitive in this model)
for(each fragment covered by this primitive){
if(failed in depth test){
discard;
}else{
fixed4 color = Shading(materialInfo, pos, normal, lightDir, viewDir);
writeFrameBuffer(fragment, color);
}
}
}
对于每个逐像素光源就需要进行上面一次完整的渲染流程。如果一个物体在多个逐像素光源的影响区域内,该物体需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后在帧缓冲中把这些光照结果混合起来得到最终颜色值。N个物体M个光源,则需要N*M个Pass,如果有大量逐像素光照,则计算量大,通常会限制每个物体的逐项素光源数目。
Unity中的前向渲染
3种处理光照方式:逐顶点处理、逐像素处理、球谐函数处理。决定光源使用哪种处理模式取决于其类型和渲染模式。光源类型指的是该光源是平行光还是其他类型的光源,而光源的渲染模式指的是该光源是否是重要的。在Light组件中设置这些属性。一定数目的光源按照逐像素处理,至多4个光源按照逐顶点处理,其余的按照球谐函数处理
有如下规则:
-场景中最亮的平行光总是按照像素处理
-渲染模式被设置成Not Important的光源按逐顶点/SH处理
-设置成Important的光源按照逐像素处理
-如果以上规则得到的逐像素光源数量小于Quality Setting中的逐像素光源数量,则会有更多的光源以逐像素的方式进行渲染
Base Pass和Additional Pass的区别
可实现的光照效果 | 渲染设置 | 光照计算 | |
Base Pass | 光照纹理、环境光、自然光、阴影(平行光的阴影) | Tags{"LightMode" = "ForwardBase"} #pragma multi_compile_fwdbase |
一个逐像素的平行光 所有逐顶点和SH光源 |
Additional Pass | 默认情况不支持阴影 (可通过#pragma multi_compile_fwdadd_fullshadows开启) |
Tags{"LightMode" = "ForwardAdd"} Blend One One #pragma multi_compile_fwdadd |
其他影响该物体的逐像素光源 每个光源执行一次Pass |
-Base Pass中支持一些光照特性,可以访问lightmap
-Base Pass中渲染的平行光默认支持阴影(若开启了光源的阴影功能),而Additional Pass中渲染的光源默认情况下没有,但可以通过编译指令开启点光源和聚光灯阴影效果
-环境光与自发光在Base Pass中计算,若在Addtional Pass计算则会叠加多次环境光和自发光
-在Additional Pass的渲染设置中开启和设置了混合模式,我