參考轉載來源,unity全球官方網站&麥子學院魏知曉&Json_c;
什么是全局光照--Global Illumination/GI?
什么是光照貼圖--LightMap?
什么是光照探頭--Light Probe?
什么是反射探頭--Reflection Probe?
1、全局光照
:全局照明(GI)是一種系統,用於模擬光如何從表面反射到其他表面(間接光),而不僅限於直接從光源擊中表面的光(直接光)。
相反,物體的光照顏色計算只局限於自身,直接從光源擊中表面的光(直接光)即是局部光照(local illumination)。
一個典型的例子是“彩色滲色”,例如,陽光擊中紅色沙發會導致紅燈反彈到其后面的牆上。 另一個是當陽光在洞穴的開口處撞擊地板並且在內部彈起時,洞穴的內部部分也被照亮。
並不能做到真正意義上的現實物理光照,要精確的仿真全局光照非常有挑戰性,付出的代價也高,正因為如此,現代游戲會先一定程度的預先處理這些計算,而非游戲執行時實時運算。
傳統上,視頻游戲和其他實時圖形應用程序僅限於直接照明,而間接照明所需的計算太慢,因此它們只能用於非實時場景,如CG動畫電影。解決這個限制的游戲方法是計算間接光,只能用於提前知道的物體和表面,不能移動(靜態)。這樣,慢的計算可以提前完成,但是由於對象不移動,所以以這種方式預先計算的間接光在運行時仍然是正確的。 Unity支持這種稱為烘烤GI(也稱為烘烤光圖)的技術,以“烘烤”命名 - 間接光被預先計算和存儲的過程(烘烤)。除間接光之外,烘烤GI還可以利用更多的計算時間,從區域燈和間接光產生比通常可以通過實時技術實現的更真實的軟陰影。
烘烤GI和預計算實時GI都有限制,只有靜態對象可以包含在烘焙/預計算中 - 所以移動物體不能將光反射到其他物體上,反之亦然。然而,他們仍然可以使用光探測器從靜態物體拾取反彈光。光探測器是在烘烤/預先計算期間測量光(探測)的場景中的位置,然后在運行時,使用來自探針的值來逼近非靜態對象的間接光,對象最接近於任何給定時刻因此,例如在白色牆壁旁邊卷起的紅色球體不會將其顏色滲透到牆壁上,而在紅色牆壁旁邊的白色球體可能會通過光線探測器從牆壁上吸收紅色的顏色。
實現組成:可實時更新的, lightmap+lightprobe+reflectionprobe+自發光材質
廣義的來說,Unity的全局光照是”實時”或是”預先計算好”的,在某些情況下兩種方法可以結合使用,照出更逼真的場景。
實時照明(REALTIME LIGHTING)
預設情況下,Unity的燈源(直接光源, 投射燈, 點光源)都是實時的,代表這些燈源會把光線照射到場景並以每一幀的頻率更新,由於光源是可以在場景內移動的對象,場景燈光的更新是實時的,你可以在游戲窗口和場景窗口看到改變。
實時照明的影響:注意到因為沒有反射光源的關系陰影是全黑的,只有投射光錐體范圍內的對象表面才有光源影響。
實時照明是場景里照亮物體最基本的方法,用來照亮角色和會動的對象,可惜的是,Unity實時照明里的光線不會反射,因此我們才導入了全局光照系統,啟用了預先計算的技術,都是為了表現一個更逼真的場景。
2、什么是light mapping?
:對一些靜態的物體和光,預先計算存儲,不必實時計算,這個過程叫做baking.baking的結果就是一張lightmapping貼圖。----針對光照穩定的靜態物體。
light mapping動態變化?
烘焙全局光照(BAKEDGI LIGHTING)
當烘焙一張光照貼圖(Lightmap)時,場景內的靜態對象會基於光的影響算出一張貼圖成果,並迭在場景對象之上建立照明效果:
左:一個簡單的光照貼圖場景成果,右:由Unity產生的一張光照貼圖(陰影和光源信息都被納入計算)
這些”光照貼圖”可以包含場景內投射到物體表面的直接光源,以及在不同物體間反射的”間接光源”,這樣的光照貼圖可以透過物體材質上的着色器(Shader)描述像是顏色的表面信息(Albedo)和凹凸(Normals)信息。
烘焙光照所產生出來的貼圖,是無法在游戲運作的時候變更運算的,因此被定義為靜態(Static),雖然仍可在這層貼圖上繼續迭加光源計算,但兩者已無法交互運算,通常我們采用這光照法來讓低階的手機能順利執行,解決光在游戲中運行的效能問題。
預計算全局光照(PRECOMPUTED REALTIME GI LIGHTING)
雖然傳統的靜態光照貼圖無法在游戲執行時改變場景光照條件,但預先計算的實時全局光照系統能幫我們實時運算復雜的場景光源互動,透過這種方法,就能建立昏暗的環境帶有豐富的全局光照反射,並實時反映光源的改變。好比做個日晷,陰影的位置和顏色會隨着光源移動改變,這在原本的烘焙光照系統是無法達成的。
一個用GI呈現的日晷案例
為了在合理的幀率實現這些效果,我們需要在實時運算之前先將一堆壟長的數字數據做”預計算”,預計算負責計算游戲過程中光的復雜行為,它可以在時間空檔時進行計算,我們稱作一個”脫機”運算。
預燈光設定(PRE-LIGHTSETTINGS)
Unity里每盞燈光默認的烘焙模式都是”Realtime”,這代表這些燈光仍然會照亮你的場景,Unity的預計算GI系統會處理間接光。但如果默認的烘焙模式是”Baked”,那么這些燈光將會透過Unity的烘焙GI系統處理直接光源和間接光源,產生出來的光照貼圖一旦貼到場景上在執行期間是不能改變的。
一個設定烘焙模式為”Realtime”的點光源
選擇烘焙模式為”Mixed”的話,場景內的靜態對象會被烘焙GI拿去做計算,然而,不像”Baked”模式,混合模式的燈光仍會繼續運算即時光源到非靜態對象上,這對於你想把靜態環境烘成光照貼圖,但同時又希望同樣一盞燈能為會動的角色計算陰影很有幫助。
GI快取(GI CACHE)
無論是烘焙還是預計算系統,Unity會”緩存”場景的光照數據到”GI快取”,並會在計算時嘗試重復運用這些數據來節省時間,你對場景的改變會影響這個數據重復利用的多寡。
如果你要清除這個快取可以從(Preference->GICache->Clear Cache)來清除,清除后代表所有數據都必須重新運算,因次會花費一些時間,在某些情況下你也許需要降低檔案空間大小(例如要把項目轉到另外一台計算機)是有幫助的。
Unity5的GI策略:
環境光(AmbientLighting)
場景中一個照亮整體環境非常重要的就是”環境光”,可以說是影響場景光源最全面的一個要素,環境光很多情況都很有用,也取決於你所選的風格,比如卡通風格的陰影不清楚或燈光是手繪風格,環境光也很適合用在當你不想單獨調整場景內的燈光但又想要增加整體場景亮度的時候。在沒有使用Unity 5全局光照的功能時,環境光不會算出准確的物理遮擋,但如果開啟了任何一種GI的情況下,從Skybox照下來的環境光就能被算出遮擋,結果會更加真實。
在同一個場景之下,左邊是沒有任何光源的場景,右邊則開啟了環境光,可以注意到調整環境光的強度天空盒的亮度並沒有改變。
透過將對象設定為靜態對象來啟用全局光照的場景,可以注意到光線在不同的表面有遮擋的效果。
使用環境光的好處是耗用效能很低,因此在手機平台上只要燈光數量控制得宜也能得到很好的表現,你可以從Lighting窗口(Window->Lighting)找到EnvironmentLighting設定區域(Lighting->Scene),改變Ambient Source來改變環境光來源。
Ambient Source的默認值是”Skybox”,上圖的天空盒是Unity 5系統產生的一個默認天空盒,帶有一個藍色調的環境光,以及一些用該半球體上純色與漸變色的設定。要注意的是改變Lighting里面的AmbientSource並不會讓Skybox的顏色改變,但會影響到場景內環境光照射。
反射源(REFLECTIONSOURCE)
默認的情況下,場景中的對象會使用Unity內建的標准着色器(StandardShader)來著色,標准着色器是一個基於物理的着色器(PBS),它會透過模仿真實世界的物理特性像是反射或能量傳遞等來模擬真實世界里光在材質上的表現。
當使用標准着色器時,每一個材質都會具有一定程度的鏡面反射(specularity)和金屬反射(metalness)屬性,在沒有強大的硬件來處理即時光跡追蹤反射的情況下,我們得仰賴預先計算著色反射,我們使用了一個由六張描述天空的圖片所組成的方體貼圖(Cubemap)或從Unity 5用來從定點搜集環境信息的反射探頭(Reflection Probe)產生所需的貼圖,然后在和其他光和地表信息混合運算來仿真如同我們真實世界看到的反射效果。
在預設的情況下,調高Specular和Metalness會更清楚的反射天空盒,反射的來源可以從設定來調整。
場景內的對象在默認的情況下會反射天空盒的內容,但你可以從Lighting接口里找到ReflectionSource屬性來改變來源,指定一個新的方體貼圖,或指定一個反射探頭來定義。
反射探頭(REFLECTIONPROBES)
天空盒的信息不可能包含所有的場景對象,在許多情況下,對象從天空搜集反射信息時可能會被遮蔽,像是室內對象或是在類似橋或是隧道等建築物里的對象,為了要准確反射這些對象,我們必須用反射探頭針對這些對象取樣,這種探頭從他們的位置對周圍取樣並把結果寫到方體貼圖,可以讓周圍經過的物體得到環境的反射影像。你可以透過GameObject->Light->Reflection Probe來新增一個反射探頭,反射探頭的位置會決定方體貼圖取樣的內容,以及反射所看起來的樣子,一般來說,基於效能考慮反射探頭越少越好,請記住,反射探頭並非用來讓物理得到精確結果,而是讓游戲世界有更好的反射,大多數情況下幾個安排妥當的反射探頭就很足夠了。
左圖:場景只有預設的反射設定 右圖:場景加入了反射探頭后的結果
在反射探頭的屬性面板我們可以設定Type為實時(Realtime),烘焙(Baked)或自定義(Custom),需要明白的是,實時反射的設定對效能極為不利,每多一個實時反射探頭就會多出額外六次的著色運算,因此擺設實時的反射探頭應該要有明確的需求,例如反射會閃動的霓虹燈,否則一般來說建議設成烘焙的就夠了,效能也會好很多。
需要注意的是,只有標記為”ReflectionProbe Static”的對象才會被反射探頭取樣,從屬性接口上靜態對象(Static)的下拉選單打勾即可,相反的,實時的反射探頭會對所有可見的物體取樣,除非你在屏蔽(Mask)選單指定剔除它。
照亮一個場景(LIGHTINGA SCENE)
我們已經介紹了一些在Unity里針對場景照明開始工作之前所需要考慮的條件,希望你對目標平台該用哪些設定已經有了一個方向(手機平台采用烘焙GI和Gamma顏色空間,PC或游戲機采用實時GI和Linear顏色空間),接下來讓我們來看看有哪些協助制定光源的工具。
總結:1,Directional,Only沒有隨距離的光衰減,常用之模擬太陽,做環境光;
2,Point,不支持陰影的間接反射,這代表由點光源產生的光線,只要在距離內有可能會穿過對象反射到另外一面,這可能會導致牆壁或地板”漏光”,因此放置點光源要格外注意,然而如果是采用Backed GI的話,就不會有這類的問題產生。
3,Spot,模擬路燈, 壁燈,或許多創意用法,手電筒、舞台燈光效果,和點光源一樣,使用預計算GI時,聚光燈不支持間接光陰影,這表示燈光會穿過幾何影響到另外一面,因此放置投射燈要特別注意。
4,Area(baked only),常見的用途是拿來當作天花板壁燈或是背光燈,目前只能和烘焙GI一起使用,區域光會均勻的照亮作用區域,在建立柔和的照明效果非常有用,光線在任何方向穿過光的表面時會產生不同方向的折射 - 造成在對象上產生漫反射;
5,Emissive Materials,模擬霓虹燈等類似的光源,只會影響場景內的靜態對象,如果你想要影響像是角色的動態對象,就必須采用光探頭系統(Light Probes);
定向光源(DIRECTIONALLIGHTS)
“定向光”非常適合用來模擬陽光,它的特性就像是個太陽,定向光能從無限遠的距離投射光源到場景,從定向光發出來的光線是互相平行的,也不會像其他種光源會分岔,結果就是不管對象離定向光源多遠,投射出來的陰影看起來都一樣,這其實對戶外場景的照明很有利。
定向光沒有真正的光源坐標,放置在場景任何地點都不會影響光的效果,只有旋轉會影響定向光的照射結果。其他有光源坐標的燈光類型,例如投射燈(Spotlights),角色陰影會因為接近或遠離光源而改變,這也許在照亮室內環境時會是個問題,一般來說,避免角色太接近隱形的光源,我們會建立一個亮點來假裝光源。
使用定向光不用考慮距離,不管多遠它都會影響場景所有的表面(除非被剔除),當使用延遲(Deferred)著色路徑時會造成一些效能損耗,要注意的是,使用這個著色路徑時,光的效能代價和他影響的像素數目是成正比的,但雖然需要消耗效能,起碼結果較為統一,因此比較容易調整平衡。
在預設情況下,新的場景都會附帶一盞定向光,在Unity 5里還會與天空盒系統關聯(Lighting->Scene->Skybox),你也可以刪除預設的定向光並創建一個新的光源,然后從Sun這個屬性重新指定(Lighting->Scene->Sun)
旋轉預設的定向光會導致天空盒也跟着更新,如果光的角度和地面平行就可以做出日落的效果,把光源轉到天空導致變黑就能做出夜晚的效果,從上往下照就會模擬日間的效果。如果天空盒有指定為環境光源(Ambient Source),那么天空盒的顏色就會影響環境里面的對象。
點光源(POINT LIGHTS)
點光源可以想象是在3D空間里一個對着所有方向發射光線的點,很適合用來制作像是燈泡, 武器發光或是從物體發射出來的爆炸效果,點光源的亮度從中心最強一直到范圍屬性(Range)設定的距離遞減到0為止,光的強度從光源到距離成反比,這是所謂的”平方反比定律”,類似光在現實世界的行為。
點光源從它的位置對四面八方射出光線,球形的小圖示代表光的”范圍”,光線到達此范圍是會”衰減”到0,但如果有間接光源或反射光則會繼續投射。
點光源開啟陰影運算是很耗效能的,因此必須謹慎使用,點光源的陰影為了要給六個不同的世界方向會運算六次,在比較差的硬件開啟此功能會造成較大的效能負擔。
當在場景中加入點光源時要注意,目前它們不支持陰影的間接反射,這代表由點光源產生的光線,只要在距離內有可能會穿過對象反射到另外一面,這可能會導致牆壁或地板”漏光”,因此放置點光源要格外注意,然而如果是采用Backed GI的話,就不會有這類的問題產生。
聚光燈(SPOTLIGHTS)
聚光燈投射一個錐體在他的Z軸前方,這個錐體的寬度由投射角度(Spot Angle)屬性控制着,光線會從源頭到設定的范圍慢慢衰減到0,同時越靠近錐體邊緣也會衰減,把投射角度的值加大會讓錐體寬度加大,同時也讓邊緣淡化的力度變大,這現象學名叫做”半影”。
聚光燈有許多用途,他們可以用來模擬路燈, 壁燈,或許多創意用法,例如模擬手電筒,因為投射區域能精確的控制,因此很適合用來模擬打在角色身上的光或是模擬舞台燈光效果等等。光線會因為離源頭越遠而遞減,可以注意到光也會因為越靠近錐體邊緣而變弱,我們稱之為半影區,這會因為錐體角度變大而更明顯。和點光源一樣,使用預計算GI時,聚光燈不支持間接光陰影,這表示燈光會穿過幾何影響到另外一面,因此放置投射燈要特別注意。
區域光(AREA LIGHTS)
區域光可以當作是攝影用的柔光燈,在Unity里面他們被定義為單面往Z軸發射光線的矩形,目前只能和烘焙GI一起使用,區域光會均勻的照亮作用區域,雖然區域光沒有范圍屬性可以調整,但是光的強度也是會隨着距離光源越遠而遞減。
區域光照亮表面並在區間產生漫反射與柔和的陰影
區域光用在建立柔和的照明效果非常有用,光線在任何方向穿過光的表面時會產生不同方向的折射 - 造成在對象上產生漫反射,常見的用途是拿來當作天花板壁燈或是背光燈,為了實現這功能,我們必須從每個光照貼圖像素上發射一定數量的光線,背對着區域光以確定光有能見度,這代表區域光的計算是消耗很大的,而且會延長烘焙的時間,但如果運用得宜可以增加場景光的深度,那么消耗就很值得,值得注意的是區域光只能用在烘焙,因此不影響游戲效能。
發光材質(EMISSIVE MATERIALS)
雖然區域光不支持實時GI,Unity提供另外一個柔和的燈光效果叫做發光材質(Emissive Materials),和區域光一樣,發光材質可以讓物體表面發光,他們可以反射場景內像是顏色或是光強度等等能在游戲內改變的光源,自發光(Emission)是一個在標准着色器(Standard Shader)內的屬性,允許靜態對象成為一個發光體,預設情況下是0,代表指定了這個材質並不會有任何的自發光反應,HDR顏色選擇器能指定發光顏色,強度能在0-1的范圍調整,來建立類似區域光的效果。
發光材質並沒有范圍屬性,但從材質發出的光會以二的次方速度遞減,自發光材質只會作用在有標記為”Static”或”LightmapStatic”卷標的對象,同樣的,如果發光材質附加在非靜態對象或像是角色的動態對象則不會有任何作用。
然而,材質設定只要emission數值大於0,即使他們不接收場景光源在畫面上也會有發光的效果,這種效果也可以透過將emission屬性底下的”Global Illumination”改為”None”,像這樣的自發光材質很適合來模擬霓虹燈等類似的光源。
使用Unity標准着色器並附加自發光材質的一個范例,注意從Unity Logo的自發光也會計算陰影,在這個案例讓球體有了陰影。
發光材質只會影響場景內的靜態對象,如果你想要影響像是角色的動態對象,就必須采用光探頭系統(Light Probes),在游戲周期改變發光材質的值會更新光探頭取樣,並直接在結果上看到變化。
光探頭(LIGHT PROBES)
靜態對象只被Unity全局光照GI系統計算,為了使動態對象能夠和靜態場景接收到的光影信息互動,我們需要紀錄這些光的信息並做成可以在執行期間快速存取的格式。我們在場景放置許多取樣點來截取各個方向搜集來的信息,顏色信息會被編成能在游戲中快速被取出的一組數值(或系數),這些取樣點我們稱為”光探頭”。
使用了光探頭的場景,注意圖中光探頭放置位置在光線容易變化的地方,例如陰影或是顏色轉換的地方。
光探頭允許移動對象接受由全局光照GI所計算出來復雜的反射光源,對象在著色網格的時候會判斷附近光探頭的位置並且把光的信息一並融合計算,這是透過找尋由光探頭所產生的一個四面體,然后決定哪個四面體的落入對象的軸向,這樣就能讓場景內的動態對象正確地接受光信息,如果沒有放置光探頭,動態對象就無法接受全局光照的信息,造成動態對象比場景還要暗。
預設的情況下,場景是沒有任何光探頭的,你必須從GameObjects->Light->LightProbe Group自行建立光探頭群組。假如全局光照里的Auto是打勾的(Lighting->Scene->Auto),當光源或是靜態對象更新時,光探頭信息也會實時更新,沒打勾的話必須點Build運算才會更新。
在烘焙之前,記得把這個LightProbe物體改成Lightmap靜態物體
烘焙之前記得把燈開啟,烘焙完成之后,選擇動態物體,然后在網格渲染里面把Use Light Probes勾上
一. 屬性:








概述:
點擊 Window > Lighting > Settings 會彈出Lighting窗口,這個就是設置全局光照的窗口。
這個Lighting窗口划分了三個區域:
1、Scene:設置適用於整個場景而不是單個GameObjects。這些設置控制燈光效果和優化選擇。
2、Global Maps:顯示所有lightmap資產文件生成的GI照明過程。
3、Object Maps:預覽當前選中的GameObject的GI lightmap紋理(包括陰影遮罩)。
下方有一個Auto Generate,勾上它,unity就會自動更新Lightmap 數據,但更新的過程非常耗時,因此不建議勾選 Auto Generate(應該勾選上更快)。可以手動點擊Generate Lighting來烘焙。(注意,unity只會烘焙
勾選了Lightmap Static 的GameObject,so 烘焙之前,首先在Inspector 面板最上方的Static 選中Lightmap Static)
Scene Tab:
1、Environment
Property: |
Function: |
---|---|
Skybox Material |
天空盒材質 |
Sun Source |
設置一個定向光(directional Light)作為場景里的太陽,如果設置為None,unity則將最亮的定向光作為太陽(太陽:不管你設置的多大遠多,光都會照到場景里) |
Environment Lighting |
環境光設置,影響來自遠處環境的光 |
Source |
漫反射環境光(ambient light,場景周圍環境的光),默認以天空盒作為環境光。 |
Color |
以某種顏色作為環境光。 |
Gradient //梯度 |
sky, horizon and ground分別選擇一種顏色,混合出一種環境光。 |
Skybox |
天空盒作為環境光, |
Intensity Multiplier//光照強度 |
環境光的亮度,范圍是0-8,默認為1。 |
Ambient Mode //環境模式 |
指定場景中GI的模式。ambient:環境的,周圍的;在MixedLighting RealtimeLighting勾選時,enabled; |
Realtime |
實時更新;Choose Realtime if you want the ambient light in the Scene to be calculated and updated in real time. 若你想要場景中的ambient light/環境光,實時的模擬更新,就選Realtime. |
Baked |
烘焙(預先計算場景中的燈光);Choose Baked if you want the ambient light to be precomputed and set into the Scene at run time. 若你想環境光被預先計算好並在Run時導入場景,選擇Baked |
Environment Reflections |
全局設置反射參數;These settings control global settings involved in Reflection Probe baking, and settings affecting global reflections. 控制與反射探頭烘焙有關的全局設置,並影響全局的反射; |
Source |
反射源。 |
Skybox |
天空盒作為反射源。 |
Custom |
用一個cube map作為反射源。 |
Compression//壓縮 |
反射貼圖是否被壓縮。 |
Auto |
如果適合壓縮,那就壓縮。 |
Uncompressed |
不壓縮。 |
Compressed |
壓縮 |
Intensity Multiplier |
反射光的強度。 |
Bounces//反彈 |
一束光的被反射的次數。 |
2、Realtime Lighting
Property: | Function: |
---|---|
Realtime Global Illumination | 是否開啟實時全景光照。 |
3、Mixed Lighting
:混合光是由那些具有自身模式屬性的光元件/light components被設置混合。
Mixed Lights 可以改變他們在運行期間的Transform/坐標&Visual Properties/光學屬性(如顏色,強度),但有很多必須的限制。他們點亮靜態和動態的物體,總是提供直接光源,並有選擇的提供反射光。
被Mixed Lights點亮的動態物體總是能在其它動態物體上產生實時陰影。
同一場場景中的所有Mixed Lights使用同一 的Mixed Lighting Mode。
a.Baked Indirect mode--間接光烘焙模式
Only indirect lighting is precomputed
最適用於中端PC和高端手機。此模式,只預先計算間接光,不預先計算陰影,陰影由Shadow Distance中實時 //Shadows are fully real-time within the Shadow Distance (menu: Edit > Project Settings > Quality > Shadows).
換句話說, 就像實時光加上間接光照,但不含Shadow Distance外的陰影。 //Realtime Lights with additional indirect lighting, but with no shadows beyond the Shadow Distance.
比如大霧天的室外,連接房間的走廊,這些可以用霧遮蓋遠處缺失的陰影或所有陰影都在shadow distance內.
b.ShadowMask mode
Indirect lighting and direct occlusion are precomputed
You also need to select the desired Shadowmask mode to use from the Quality Settings (menu: Edit > Project Settings > Quality):
- Shadowmask: Static GameObjects that cast shadows always use baked shadows.
- Distance Shadowmask: Unity uses real-time shadows up to the Shadow Distance, and baked shadows beyond.
c.Subtractive mode
All light paths are precomputed
最適用於低端裝備。
混合光照模式中唯一一個將直接光烘焙進光照貼圖的,並丟棄了前兩個模式中合成靜態/動態陰影的信息。
Property: | Function: |
---|---|
Baked Global Illumination | 是否采用烘焙的全局光照。 |
Lighting Mode | 決定混合燈光和陰影與場景中物體的共存方式; 修改了Light Mode需要重新烘焙,當然勾選了Auto Generate,就不用了,不然要click Generate Lighting。 |
Realtime Shadow Color | 實時陰影的顏色。 |