歡迎參與討論,轉載請註明出處。
前言
近日在琢磨Demo應該選擇怎樣的光照模式,遂做了個試驗:對比在同一場合下,各種模式的情況。故以此文記錄之(版本爲2019.2、平臺爲Standalone、渲染管線爲Builtin)。
環境光
環境光(Ambient)嚴格來說並不是一種光照,它只是單純的爲所有顯示元素上色罷了。可以理解爲2D遊戲便是有個(255, 255, 255)環境光。可於**(Window → Rendering → Lighting Settings)**下的Environment Lighting進行設置。
環境光是無論如何都需要的,一般用於決定畫面的底色。下圖便是用了白色的效果:
看到上圖便能理解我說的「環境光嚴格來說並不是一種光照」,畢竟連影子都沒有,整個畫面顯得很單薄。但事實上在早期、以及現在一些不依賴光影的遊戲是有這種做法的。它們一般會採用類似2D遊戲的做法,在素材層面解決各種顯示效果問題。對於不依賴光影、強調美術的絕對控制的遊戲,使用純環境光是個方案。
順帶一提,在Environment Lighting設置下的Gradient與Skybox模式有着不一樣的效果,屬於更高級的環境光實現。
實時光
實時光(Realtime)顧名思義,就是每時每刻都在進行的光照。在Light組件的Mode屬性設置爲Realtime即是。實時光的優缺點很明顯,如下:
- 優點
- 遊戲時可隨時改變光照的狀態,即刻產生反應
- 隨取隨用,無需烘焙
- 光照效果最好
- 缺點
- 在正向渲染(Forward Rendering)下,畫面同時出現多個光照時,開銷較大
- 爲了節能,某些設備、設置下,光照的數量有限
實時光一般就是開箱即用到的光照,效果如下:
可以看得出,各項消耗指標都比純環境光要高,而該場景只有三項光照(平行光1個、聚光燈2個)。故一般遊戲都不會如此奢侈,會採用各種手段來達到相同的效果。
而以上卻還不是效果的極致,還差個全局光照(Global Illumination)呢。剛纔所見的光照只是「直接的光照」罷了,它只會考慮到照到了誰便處理誰,沒有從全局的角度去考慮。在開啓全局光照後,除了直接光照之外,還會產生物件之間相互反射的間接光照。效果如下:
從畫面效果來看變得更爲深邃了,牆壁與地板都有了反射後的光漬,而各項指標實際上與局部並無不同(疑似)。使用它的前提是要在上文的Lighting Settings下開啓Realtime Global Illumination,並且爲靜態物件做好Static標記。具體實現細節請自行查閱官方文檔,在此不表。
當然,這並不代表全局光照優於局部光照,就比如有些遊戲的畫面風格並不喜歡那些全局光照帶來的光漬。還是要看想要怎樣的美術效果。
烘焙光
烘焙光(Baked)可謂實時光的反面:根據光照信息預先渲染成貼圖,最後蓋到場景上。這個「根據光照信息預先渲染成貼圖」的過程,是爲烘焙。而烘焙的類型、算法、設置有着多樣化的選擇,直接影響烘焙的時長、效果、貼圖大小與數量。也因烘焙的特性,只適用於靜態物件(標記爲Static的對象)。優缺點如下:
- 優點
- 部分渲染元素(取決於烘焙類型)沒有實時運行的開銷
- 屬於全局光照,擁有間接光
- 缺點
- 光照屬性不能運行時修改
- 動態物件不受影響
- 烘焙耗時
烘焙類型主要分三種,效果如下:
Subtractive: 全烘焙
Shadowmask: 烘焙陰影與間接光
Backed Indirect: 只烘焙間接光
可以看到效果是一個比一個好,但性能卻是一個比一個耗。並且可以看出,由於烘焙設置的問題,效果是不如實時光的。而通過設置達到最優的話,烘焙時長則又是個問題了,魚和熊掌不可兼得啊(砸錢便能我全都要)。
對於Subtractive,只需把Light組件的Mode屬性設置爲Baked即可。對於其餘兩種,實際上是一種實時光+烘焙光的混合方案,則需設置爲Mixed。由於動態對象不受烘焙光影響的特性,Subtractive下的膠囊仔直接跟純環境光時一個樣了。解決方案有很多種,如採用Mixed方案(靜態物件烘焙光、動態物件實時光)、Light Probes等。
順帶一提,關於Shadowmask,在陰影設置中可調爲Distance Shadowmask。如此將取決於陰影距離的設置,在陰影距離內的陰影,將採用實時陰影,距離之外的則是烘焙陰影。也算是一種提升品質的方式吧。
烘焙光在業界的應用相當廣泛,其中Subtractive式烘焙在早期遊戲與現代手遊可謂家常便飯,妥善使用Light Probes也能達到不俗的效果。
後記
以上只是本人粗略的實驗與記錄,實際上光照的內容浩如煙海,遠非本篇所能涵蓋。在光照方面本人也只能算是初學者,有所不對還請海涵,並歡迎指教。