<aside> <img src="/icons/alien-pixel_gray.svg" alt="/icons/alien-pixel_gray.svg" width="40px" /> 這一章節的內容很多,而且也很重要,必須認真看。因為都是光柵化的渲染基础。光照的內容實在是太多了,一本書也不可能講得完。所以進階內容只能通過自學來深入了解。

</aside>

渲染路徑(Rendering Path)

如果當前顯卡不支持所選渲染路徑,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

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數目也會很大。所以渲染引擎通常會限制每個物體的逐像素光照的數目。

前向渲染的光照處理