<aside> <img src="/icons/alien-pixel_gray.svg" alt="/icons/alien-pixel_gray.svg" width="40px" /> 這一章節的內容很多,而且也很重要,必須認真看。因為都是光柵化的渲染基础。光照的內容實在是太多了,一本書也不可能講得完。所以進階內容只能通過自學來深入了解。
</aside>
如果當前顯卡不支持所選渲染路徑,Unity會自動使用比其低一級的渲染路徑。
Shader的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 {
Tags { "LightMode" = "ForwardBase" }
}
Forward Rendering Path偽代碼
Pass {
for (each primitive in this model) {
for (each fragment covered by this primitive) {
if (failed in depth test) {
// 如果沒有通過深度測試,捨棄
discard;
} else {
// 通過深度測試
// 計算光照計算
float4 color = Shading (material, pos, normal, lightDir, viewDir);
// 更新顏色緩衝
writeFrameBuffer (fragment, color);
}
}
}
}
每一個光照都需要計算一次,所以如果存在大量的逐像素光源,那麼需要執行的次數也會很大。假設場景中有N個物體,還有M個光源照亮著場景。那麼就需要執行$N \times M$次的計算。可以看出,如果有大量逐像素光照,那麼需要執行的Pass數目也會很大。所以渲染引擎通常會限制每個物體的逐像素光照的數目。