光照與渲染(二) 光照技術

2021-08-11 08:17:12 字數 2933 閱讀 1070

廣義的來說,unity的全域性光照是」實時」或是」預先計算好」的,在某些情況下兩種方法可以結合使用,照出更逼真的場景。

本節我們會針對兩種技術的差異優勢和使用時機做個簡單的描述。

實時照明(realtime lighting)

預設情況下,unity的燈源(直接光源, 投射燈, 點光源)都是實時的,代表這些燈源會把光線照射到場景並以每一幀的頻率更新,由於光源是可以在場景內移動的物件,場景燈光的更新是實時的,你可以在遊戲視窗和場景視窗看到改變。

實時照明的影響:注意到因為沒有反射光源的關係,陰影是全黑的,只有投射光錐體範圍內的物件表面才有光源影響。

實時照明是場景裡照亮物體最基本的方法,用來照亮角色和會動的物件。

可惜的是,unity實時照明裡的光線不會反射,因此我們才匯入了全域性光照系統,啟用了預先計算的技術,都是為了表現乙個更逼真的場景。

烘焙全域性光照(baked gi lighting)

當烘焙一張光照貼圖(lightmap)時,場景內的靜態物件會基於光的影響算出一張貼圖成果,並迭在場景物件之上建立照明效果:

左:乙個簡單的應用光照貼圖的場景,右:由unity產生的一張光照貼圖(陰影和光源資訊都被納入計算)

這些」光照貼圖」可以包含場景內投射到物體表面的直接光源,以及在不同物體間反射的」間接光源」,這樣的光照貼圖可以透過物體材質上的著色器(shader)描述像是顏色的表面資訊(albedo)和凹凸(normals)資訊。

烘焙光照所產生出來的貼圖,是無法在遊戲運作的時候變更運算的,因此被定義為靜態(static),雖然仍可在這層貼圖上繼續迭加光源計算,但兩者已無法互動運算,通常我們採用這光照法來讓低階的手機能順利執行,解決光在遊戲中執行的效能問題。

預計算全域性光照(precomputed realtime gi lighting)

雖然傳統的靜態光照貼圖無法在遊戲執行時改變場景光照條件,但預先計算的實時全域性光照系統能幫我們實時運算複雜的場景光源互動,透過這種方法,就能建立昏暗的環境帶有豐富的全域性光照反射,並實時反映光源的改變。好比做個日晷,陰影的位置和顏色會隨著光源移動改變,這在原本的烘焙光照系統是無法達成的。

乙個用gi呈現的日晷案例

為了在合理的幀率實現這些效果,我們需要在實時運算之前先將一堆壟長的資料做」預計算」,預計算負責計算遊戲過程中光的複雜行為,它可以在時間空檔時進行計算,我們稱作乙個」離線」運算。

那麼它是如何運作的?

最常見的需求是我們希望間接光源能夠列入場景光照貼圖的計算,幸好,原理上這些間接光源都是從直接光源慢慢轉變過來的顏色,只有少部分特定情況有比較大幅度的顏色改變,這樣的unity的全域性光照預計算,利用間接光源漫反射(diffuse)特性對運算有利。通常好的陰影是透過即時光源所計算出來的,而非烘焙到光照貼圖,假定我們並不需要太複雜的細節取樣,可以大大降低全域性光照所產生的資料大小。

透過預計算來簡化整個流程,有效的降低了原本要在遊戲中實時計算的全域性光照運算數量,如果你要經常在遊戲中改變光源顏色,旋轉光源或是調整光的強度,甚至對場景表面做變更,這點就很重要。unity從表面上取樣底層貼圖,並從廣義定義顏色的值到乙個大型的群組,或是」集群」,這會產生乙個低解析的**靜態幾何,以方便我們用來計算光照。

左:場景顯示設定為」albedo」時,可以清楚看到由unity預計算所產生的紋理;右:如同遊戲的場景一樣,即時光照計算完結果後套用到場景。

基本上,當在計算全域性光照時,我們會針對靜態場景周圍做」光跡追蹤」運算,這是非常耗效能的,因此無法苛求要實時運算,相反的,unity把光跡追蹤用在計算這些表面的集群關係 - 在預計算」光傳輸」的階段,然後把世界串成乙個網路結構,我們在關鍵性的遊戲過程就不再需要耗費效能的光跡追蹤法。

我們有效的創造出乙個簡化的演算法可以在遊戲過程中變化輸入結構,這代表我們可以改變光源或是表面顏色,並很快的看到場景內全域性光照的影響,算出的結果產出光照貼圖透過gpu著色,並和其他照明或是表面混合,最後輸出到螢幕上。

收益和成本(benefits and costs)

雖然可以同時使用烘焙方式的gi和預計算的gi,但要注意是同時**兩個系統,效能負擔也會兩次運算的總和,不只是因為要儲存兩套光照貼圖在顯示卡記憶體,同時著色器也得付出兩次的處理成本。

最終要選擇哪個方法還是要取決於你專案的性質和預期的硬體考慮,例如在手機平台上,效能和記憶體限制較高,烘焙的gi法就會比較適合,如果是在有顯示卡的計算機上或是遊戲機上執行,那可能使用預計算實時全域性光照,或兩個同時使用就比較可行。決定採用哪一種方法可以針對你的目標平台評估,記得如果專案要同時符合幾個不同的硬體需求,往往都是以效能最高的平台為考慮。

預燈光設定(per-light settings)

unity裡每盞燈光預設的烘焙模式都是」realtime」,這代表這些燈光仍然會照亮你的場景,unity的預計算gi系統會處理間接光。但如果預設的烘焙模式是」baked」,那麼這些燈光將會透過unity的烘焙gi系統處理直接光源和間接光源,產生出來的光照貼圖一旦貼到場景上在執行期間是不能改變的。

乙個設定烘焙模式為」realtime」的點光源.

選擇烘焙模式為」mixed」的話,場景內的靜態物件會被烘焙gi拿去做計算,然而,不像」baked」模式,混合模式的燈光仍會繼續運算即時光源到非靜態物件上,這對於你想把靜態環境烘成光照貼圖,但同時又希望同樣一盞燈能為會動的角色計算陰影很有幫助。

光照渲染 用canvas模擬光照效果

我們能看到物體,是因為光照射在物體上然後反射到我們的眼睛當中。其中的影響因素非常多 觀察者的位置 光源的位置 光的顏色 物體表面的顏色 材質和粗糙程度等等。以後我們將會詳細 如何模擬物體的材質,在這篇文章中我們只討論光源。太陽的尺度相對地球來說非常大,所以可以認為從太陽照射來的光線都是平行的,即太陽...

Unity 光照和渲染

unity 文件 using real time lighting with realtime gi 完全理解unity中precompute realtime gi及其優化 一 完全理解unity預計算全域性光照及其優化 二 unity預計算全域性實時gi 九 lightmap parameter...

CG語言 基本光照渲染

本人新人一枚,想要將自己所學分享給大家,如有錯誤或不足請大家毫不猶豫的指出,謝謝大家的支援!那麼開始吧 乙個物體我們能看見是通過被光線照亮後經過反射進入我們的眼睛後大腦成像。計算機 gpu 就是計算進入眼睛之前的各個步驟得到的從而給我們反饋乙個結果。計算公式 su cecolor emissive ...