(二十八)unity shader之——————基於光照貼圖(lightmap)的烘焙詳細介紹

光照貼圖(Lightmap)是一種效果明顯的模擬光照的方法,這種光照貼圖需要提前渲染,因此可以應用在靜態效果圖中,屬於全局照明技術。但是這種方法一般只適用於靜態物體。當然unity做了很多工作,可以讓我們混合使用靜態光照貼圖和動態實時光源,無縫地照亮場景中靜態或動態的物體。

注意,受到光照貼圖的影響的物體只能在靜態物體上合併批次渲染。動態和GPU  Instancing兩種合併批次的方式unity不支持(unity2018支持GPU  Instancing)。unity對光照貼圖支持在於導入一張光照貼圖,被多個物體共享,然後使用一個Vector4的數據類型規定貼圖的大小和偏移量。

光照貼圖不僅可以在unity中創建,還可以使用任何可渲染軟件來創建,但這裏只使用unity中的Lightmapper。

一、烘焙的維度和屬性矩陣

照明的屬性矩陣介紹如下:

首先物體或者燈光有靜態和動態之分,這是一個維度,有兩個屬性

其次,燈光(Light)組件有兩個屬性Mode和Render Mode。Mode的可選值爲Midxed、Realtime、Baked,Render Mode的可選值爲Auto、Important、Not Important。兩者都有3個可選項,兩兩組合就對應9種情形,或者說一個3X3的屬性矩陣。

最後,可以烘焙的光照不僅有燈光,還有自發光的物體,因此這又是一個維度。

因此與烘焙有關的有3個維度——StaticXLightX自發光,每一個維度的複雜性又各不相同,Light的屬性最複雜。

二、光照貼圖

最簡單的光照貼圖是單光照貼圖(對應於Non-Directional方向模式)。在單光照貼圖烘焙模式下,將不會存儲光源信息,所以諸如凹凸貼圖和高光這種依賴於光源方向的着色技術將無法使用,同時也意味着有更少的貼圖需求,只要有一張貼圖即可。

2.1測試烘焙場景

烘焙之前,渲染路徑設置爲前向通道,烘焙會產生光照貼圖,同時還會產生一個LightingData.asset文件。這個文件裏不僅有光照貼圖的信息,還可選性地包括GI以及與Light Probes的信息。

2.2烘焙之後的場景

如上圖所示,除動態自發光材質以及Realtime和Not Important光源之外,其他的光照都會被烘焙,(動態物體的光源,也會被烘焙到靜態地面上)。

2.3雙光照貼圖

這種模式採用了另一張貼圖來存儲主光源在每一個點的方向以及一個比例因子。這個比例因子用來控制光照貼圖中的能量有多少來自於這個主光源所在的方向。所謂每一個點就是使用光照貼圖的UV在光照貼圖中採樣到的像素點。因爲在每一個像素點存在主光源方向,所以法線貼圖可以用來和光照貼圖中的數據進行光照計算。

三、在效果和性能間進行權衡

這個問題在資源受限的地方尤爲突出,如web端和移動端。

3.1影響全局的Resolution選項

在Lightmapping Settings一欄,有些設置是影響烘焙的時間和精度的,還有些影響的則是最終光照貼圖的大小。Lightmmaper有兩個選項,這裏使用Enlighten,其他的參數如果帶有Lightmap字眼,則和最終的光照貼圖大小、數量以及精度有關。Lightmap Size決定了一張光照貼圖的最大尺寸。如果Lightmap Resolution確定,當一張光照貼圖不能放下所有靜態物體的信息時,則會創造更多張光照貼圖,以便保持被烘焙物體的光照貼圖分辨率。Lightmap Padding則決定了在光照貼圖中兩個不同物體相互之間的最小像素間距。

其他參數決定的則是線下烘焙時長和GI的細分程度。

3.2 單個物體的選項

除Lighting面板之外,單個物體也有和光照烘焙相關的參數,這些參數現在位於Mesh Renderer複選框下面:

Scale In Lightmap參數還可以有選擇地讓某個被烘焙的物體對應的貼圖部分變小。如果覺得地面不重要,可以讓它的光照貼圖部分變小。如果覺得某個光源比較重要,Prioritize Illumination選項可以告訴unity在計算光照的時候總是將它計算在內。Prioritize Illumination選項在實時GI計算中比較有意義。

如果想在不同的場景甚至不同的工程中使用相同的烘焙參數,那麼還可以像創建預製件(prefab)一樣創建Lightmap Parameters。也可以在Lighting面板中單機Lightmap Parameters下拉列表。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章