分類:Unity、C#、VS2015
建立日期:2016-04-11
一、簡介
燈光(Light,也叫光源)是每一個場景的重要組成部分,用於照亮場景和物件,從而讓遊戲具有自己的個性和風格,比如利用燈光可模擬太陽、燃燒的火柴光、手電筒、炮火或爆炸等。
網格模型和材質紋理決定了場景的形狀和質感。燈光則決定了場景環境的明暗、色彩和氛圍。每個場景中可以使用—個以上的燈光,合理地使用燈光可以創造完美的視覺效果。
在 Unity 專業版中,所有燈光都可以有選擇地投射立方體貼圖紋理。立方體貼圖 (Cubemap) 在所有方向都會被投射出陰影。
二、燈光型別
Unity 5.3.4中有 4 種燈光。建立燈光的方式同建立其他遊戲物件的方式相似:
由於不同型別的光源屬性相似,因此這裡將其放在一起來介紹。
1、Type
光源型別。
(1)Directional
方向光源。這種型別的燈光可以被放置在無窮遠處,可以影響場景中的一切遊戲物件,類似於自然界中太陽光的照明效果。
方向光源是最不耗費圖形處理器資源的光源型別。
方向燈主要用於模擬室外場景中的太陽光與月光。其會影響場景中所有物件的表面。它們的圖形處理器成本最低。方向燈(對支援陰影的平臺而言)投射的陰影在下圖中得到了深入地解釋。
在方向燈具有 Cookie 時,Cookie 會被投影到燈的 Z 軸的中心位置。Cookie 的大小是由Coikie 大小 (Cookie Size) 屬性控制的。在檢視器 (Inspector) 中將 Cookie 紋理的迴圈模式設定為重複 (Repeat)。
下圖是投影雲狀 Cookie 紋理的方向燈:
Cookie 是在大型戶外場景中快速新增細節的好方法。你甚至可以在場景中慢慢移動燈,製造出雲在動的效果。
注意,當使用正向渲染時,會對具有 Cookie 的方向燈禁用陰影。然而,可以通過使用 fullforwardshadows編寫自定義著色器 (custom shader) 來啟用陰影。
(2)Point
點光源從一個位置向四面八方發出光線,影響其範圍(Range)內的所有物件,類似燈泡的照明效果。點光源的陰影是較耗費影象處理器資源的光源型別。
(3)Spot
聚光燈。這種燈光從一點發出,在一個方向按照—個錐形的範圍照射,該錐形是由聚光燈角度 (Spot Angle) 和範圍 (Range) 界定的。
聚光燈是較耗費圖形處理器資源的光源型別。
這種燈隻影響它照射區域內的物件,適用於模擬汽車的前燈、手電筒、舞臺場景中的射燈、……等照明效果。下圖是聚光燈效果:
聚光燈也可以有 Cookie - 錐形光照投射下來的紋理。這很適合用於製作光照穿過窗戶的效果。紋理的邊緣是黑色非常重要,也就是要啟用邊框多層貼圖 (Border Mipmaps) 選項,而且其迴圈模式 (wrapping mode) 要設定為拉伸 (Clamp)。
下圖是具有一個 Cookie 的聚光燈:
(4)Area
區域光/面光源。該型別的光源無法應用於實時光照,僅適用於光照貼圖烘焙 (lightmap baking)),這種光能從各方向照射一個平面的矩形截面的一側。
區域燈。能從各方向照射一個平面的矩形截面的一側的燈。矩形是由寬度 (Width) 和高度 (Height) 屬性定義的。區域燈僅可於光照貼圖烘焙 (lightmap baking) 期間使用,且在執行時對物件沒有影響。
區域燈從一個平面的矩形截面的一側投射燈光。
燈光被投射在燈光範圍內的所有物件上。矩形的大小是由“寬度”(Width) 和“高度”(Height) 屬性決定的,且平面的法線(例如燈光投射到的一側)與燈光的正 Z 方向相同。燈光從矩形的整個表面發出,因此受其影響的物件的陰影比受點燈或方向性燈影響的物件的陰影更柔和。
由於光照計算需密集使用處理器,所以區域燈在執行時無法使用,且只能烘焙到光照貼圖 (lightmap) 中。
2、Range
範圍。用於控制光線從光源物件的中心發射的距離。該屬性僅適用於點光源(Point Light)或者聚光燈(Spot Light)。
3、Spot Angle
聚光燈角度。決定錐形的角度。僅適用於聚光燈 (Spot)。
4、Color
顏色。所發射的光的顏色。
5、Intensity
強度。光的亮度。點燈 (Point)/聚光燈 (Spot)/區域燈 (Area) 的預設值為 1。方向燈 (Directional) 的預設值為 0.5。
6、Cookie
該項用於為光源指定擁有alpha通道的紋理,使光線在不同的地方有不同的亮度。如果果光源是聚光燈或方向光,只能指定—個2D紋理。如果光源是一個點光源,該項必須指定—個Cubemap(立方體貼圖)。
您可以建立一個含有 alpha 通道的紋理,並將其分配給燈光的 Cookie變數。Cookie 會被燈光投影。Cookie 的 alpha 遮蔽圖調節光量,在表面生成亮點和黑點。這種方法非常適合用於大大增加場景的複雜性和氛圍。
Unity 中的所有內建著色器都可與每一型別燈光無縫配合。然而,頂點光照 (VertexLit) 著色器無法顯示 Cookie 或陰影 (Shadows)。
7、Cookie Size
縮放 Cookie 的投影。僅方向燈 (Directional) 才有此引數。
8、Shadow Type
陰影型別(僅限專業版)。為光源選擇陰影型別。可以選擇No Shadows(關閉陰影)、Hard Shadows(硬陰影)以及Soft Shadows(軟陰影)。
注意軟陰影會消耗更多的系統資源。
預設設定下,只有方向光源才可以開啟陰影。
如果希望開啟點光源或者聚光燈光源的陰影(只有釋出為Web版或單機版才支援),可通過選單欄中的【Edit】→【Project Settings】→【P!ayer】選項,然後在檢視器檢視中通過Rendering Path(渲染路徑)進一步設定Deferred Light型別。
Rendering Path的選項有:
(1)VertexLit
頂點光照。這種光照效果最差,不支援陰影。一般用於配置交叉的機器或受限的移動平臺。
(2)Forward
正向著色。能很好地支援光的照射效果,但不支援點光源、聚光燈。
(3)Deferred Lighting
延遲光照(僅Pro版才支援)。支援最佳的光照效果及所有型別光源投射的陰影,但需要一定程度的硬體支援。
9、Strength
陰影強度。陰影的暗度。其值介於 0 和 1 之間。
10、Resolution
解析度。控制陰影解析度的質量。有5項可供選擇:使用質量沒置、低質量、中等質量、高質量、更高質量。
11、Bias
偏移。該項用於設定燈光空間的畫素位置與陰影貼圖的值相比較時使用的偏移量。取值範圍是0~0.5。如果該值過小,遊戲物件表面會產生sele-shadow,即物體的表面會有來自於自身陰影的錯誤顯示;如果該值過大,陰影就會較大程度地偏離投影的遊戲物件。
12、Softness
柔化。控制陰影模糊取樣區的偏移量。僅適用於方向燈 (Directional)。
13、Softness Fade
柔化淡出。控制陰影與攝像機的距離淡出的程度。僅適用於方向燈 (Directional)。
14、Draw Halo
繪製光暈。如果勾選此項,光線的球形光暈將被繪製,該光暈的半徑與範圍 (Range) 相等。有關更多詳細資訊,另請參閱光暈文件和渲染設定文件。
15、Flare
耀斑/眩光。可選擇指代為將在光的位置被渲染的光斑。
16、Render Mode
渲染模式。此種光的重要性。這會影響光照保真度和效能,請參閱下面的效能注意事項。選項包括:
Auto:自動。在執行時根據附近燈光的亮度和當前的質量設定確定渲染方法。
Important:重要。燈光總是逐個畫素被渲染。請僅將此功能用於非常重要的效果(例如,玩家汽車的前燈)。
Not Important:不重要。燈光總是在更快的頂點/物件光模式下被渲染。
17、Culling Mask
剔除遮蔽圖。用於有選擇地使某些物件組不受燈光影響;請參閱雙光照貼圖。
18、Lightmapping
光照貼圖。該項用於控制光源對光照貼圖影晌的模式。
RealtimeOnly:僅實時燈光計算,不參與光照貼圖的烘焙計算。
Auto:自動。
Bakedonly:僅作用於光照貼圖的烘焙,不進行實時燈光計算。
19、Width、Height
寬度 (Width) (僅適用於區域燈)矩形光照區域的寬度。
高度 (Height) (僅適用於區域燈)矩形光照區域的高度。
三、效能注意事項
燈光有兩種渲染方式:頂點光照和畫素光照。
頂點光照僅計算遊戲模型頂點處的光照,且將光照插入到模型的表面上。
畫素光照在螢幕的每個畫素處被計算,因此更消耗資源。
一些較舊的顯示卡只支援頂點光照
儘管畫素光照渲染得更慢,但它能夠實現一些頂點光照不能實現的效果。法線貼圖 (normal mapping)、燈光Cookie (light Cookie) 和實時陰影(realtime shadow) 都是僅能在畫素模式下渲染。在畫素模式下,聚光燈的形狀和點燈高光效果也更好。
在頂點燈光模式下渲染時,以上三種燈的光的效果如下。
下圖是頂點光照模式下點光源(Point)的照射效果:
下圖是頂點光照模式下聚光燈(Spot)的照射效果:
下圖是頂點光照模式下方向燈(Directional)的照射效果:
燈光對渲染速度有非常大的影響 - 因此必須在光照質量和遊戲速度之間加以權衡。由於畫素燈光比頂點燈光耗費的資源要多得多,因此Unity僅僅逐畫素渲染需要“最亮的光”時的效果。可在質量設定中為網路播放器和單機版編譯目標設定畫素燈光的實際數量。
您可以使用渲染模式 (Render Mode) 屬性來明確地控制光是否應渲染為頂點或畫素燈光。預設情況下,Unity將基於物件受光影響的程度自動將光分類。哪些燈光實際上被渲染為畫素燈光是由具體的物件決定的。