渲染路徑主要用於和光源打交道,shader編寫中需要為pass指定渲染路徑,這樣unity才會明白程式設計師想要使用的渲染路徑,然後將光源和處理後的光照資訊放到這些資料裡,程式設計師才能在著色器中進行訪問。
大多數情況下,乙個專案只使用一種渲染路徑,因此我們可以為整個專案設定渲染時的渲染路徑。在unity的edit->project settings->player->other settings->rendering path中選擇專案所需的渲染路徑。預設情況下,該選擇的是前向渲染路徑。
但乙個攝像機下可指定不同的渲染路徑,同樣在rendering path下指定。
利用pass標籤下的lightmode來指定渲染路徑,eg:
pass
上面的**將告訴unity,該pass將使用前向渲染路徑中的forwardbase路徑。
lightmode標籤支援的渲染路徑設定選項
標籤名描述always
不管使用哪種渲染路徑,該pass總是會被渲染,但不會計算任何光照
forwardbase
用於前向渲染,該pass會計算環境光,最重要的平行光,逐頂點/sh光源和lightmaps
forwardadd
用於前向渲染。該pass會計算額外的逐畫素光源,每個pass對應乙個光源
deferred
用於延遲渲染。該pass會渲染g緩衝(g-buffer)
shadowcaster
把物體的深度資訊渲染到陰影對映紋理(shadowmap)或一張深度紋理中
prepassbase
用於遺留的延遲渲染。該pass會渲染法線和高光反射的指數部分
prepassfinal
用於遺留的延遲渲染。該pass通過合併紋理、光照和自發光來渲染得到最後的顏色
vertex、vertexmrgbm和vertexlm
用於遺留的頂點照明渲染
使用渲染路徑的主要作用是為unity內建的光照變數進行正確的賦值。
原理:每進行一次完整的前向渲染路徑,我們需要渲染該物件的渲染圖元,並計算兩個緩衝區資訊:乙個是顏色緩衝區,乙個是深度緩衝區,深度緩衝區決定乙個片元是否可見,如果可見再更新顏色緩衝區中的顏色值。
前向渲染三種處理光照的方式:
1. 逐頂點處理
2. 逐畫素處理
3. 球鞋函式處理(sh處理)
決定乙個光源使用哪種處理模式取決於它的型別和渲染模式。光源型別是指該光源是平行光還是點光源還是其他型別的光源。而光源的渲染模式指的是該光源是否是重要的。
unity實際處理光源使用的判斷規則如下:
前向渲染兩種pass**:(basepass和additional pass)
延遲渲染
在前向渲染下的場景中光源數目較多造成效能瓶頸的情況下使用
原理:延遲渲染主要包含個pass。在第乙個pass中,我們不進行任何光照計算,而是僅僅計算哪些片元是可見的,這主要是通過深度緩衝技術來實現,當發現乙個片元是可見的,我們就把它的相關資訊儲存到g緩衝區中。然後,在第二個pass中,我們利用g緩衝區的各個片元資訊,例如表面法線,視角方向,漫反射係數來進行真正的光照計算。
偽**:
pass 1else}}
}pass 2
}}
延遲渲染使用的pass數目通常就是兩個,這跟場景中包含的光源數目是沒有關係的。所以延遲渲染的效率不依賴於場景的複雜度,而是和我們使用的螢幕空間的大小有關。這是因為,我們需要的資訊都儲存在緩衝區中,而這些緩衝區可以理解成一張張2d影象,我們的計算實際上就是在這些影象空間中進行的。
使用延遲渲染的注意事項:
光源的型別:
shader**:
shader "custom/chapter9-forwardrendering"
subshader
cgprogram
//使用該指令能確保使用光照衰減等光照變數能被正確賦值
#pragma multi_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
fixed4 _diffuse;
fixed4 _specular;
float _gloss;
struct a2v;
struct v2f;
v2f vert(a2v v)
fixed4 frag(v2f i):sv_target
endcg
}//additional pass
pass
//設定混合模式
blend one one
cgprogram
//使用該指令能確保使用光照衰減等光照變數能被正確賦值
#pragma multi_compile_fwdadd
#pragma vertex vert
#pragma fragment frag
#include "lighting.cginc"
#include "autolight.cginc"
fixed4 _diffuse;
fixed4 _specular;
float _gloss;
struct a2v;
struct v2f;
v2f vert(a2v v)
fixed4 frag(v2f i):sv_target
endcg}}
fallback "diffuse"
}
unity Shader複雜光照
一 渲染路徑 1 unity支援的渲染路徑 前向渲染路徑 forword 延遲渲染路徑 deferred 頂點照明渲染路徑 vertex lit 2 可以在專案上設定 也可以在攝相機上設定或者在shader上設定,在shader上利用lightmode標籤實現。3 pass的lightmode標籤支...
Shader筆記9 更複雜的光照 四種渲染路徑
總結unity5.0版本之前,有3中渲染路徑 設定整個專案的渲染路徑 edit project srtting player other setting rendering path 中選擇專案所需的渲染路徑 使用多個渲染路徑,可以讓攝像機覆蓋project setting中的設定 若當前顯示卡並不...
簡單光照模型(Lambert 光照模型)
環境光是對光照現像的最簡單抽象,因而侷限性很大。它僅能描述光線在空間中無方向並均勻散布時的狀態。很多情況下,入射光是帶有方向的,比如典型的陽光。如果光照射到比較粗糙的物體表面,如粉筆,由於這些表面從各個方向等強度地反射光,因而從各個視角出發,物體表面呈現相同的亮度,所看到的物體表面某點的明暗程度不隨...