游戲場景中燈光照明的構成
現實生活中的光線是有反射、折射、衍射等特性的。對這些基本特性的模擬一直以來都是計算機圖形圖像學的重要研究方向。
在CG中,默認的照明方式都是不考慮這些光線特性的,因此出來的效果與現實生活區別很大。最早期的時候,人們利用各種方式來模擬真實光照的效果,比如手動在貼圖上畫上柔和陰影,或者用一盞微弱的面積光源去照明物體的暗部以模擬漫反射現象等等。
然后出現了所謂的高級渲染器,用計算機的計算來代替我們的手工勞動來進行這個“模擬”的工作。在漫長的發展過程中,出現過很多很多計算方案,總體上分為這樣幾類:
- 直接模擬光線從被光源發出到最終被物體完全吸收的正向過程,也就是常說的GI(Global Illumination);
- 不直接模擬光線,而是反向搜集物體表面特定點的受光照強度來模擬現實照明效果,也就是常說的FG(Final Gathering);
- 完全不考慮光線的行為,單純基於“物體上與其他物體越接近的區域,受到反射光線的照明越弱”這一現象來模擬模擬現實照明(的一部分)效果,也就是常說的AO(Ambient Occlusion);
- 將場景光照結果完全烘焙到模型貼圖上,從而完完全全的假冒現實光照效果,也就是我們所說的Lightmap。
不論是GI還是FG,計算量都是非常大的,一幀圖片需要幾十分鍾甚至幾十小時來渲染,所以很難被應用在游戲設計領域。
因此在游戲設計領域,光照貼圖技術依然是目前的主流方式。
由於光照貼圖需要事先烘焙(baking)出來,且僅支持靜態物體(Static Object),而我們的游戲場景中幾乎不可能全都是靜態物體,所以通常游戲場景中的燈光照明是多種照明方式的混合作用。
- 對於靜態物體來說,大多使用光照貼圖來模擬間接光的照明效果,然后加上直接光源的動態照明效果;
- 對於運動物體來說,則僅用直接光源的動態照明效果,或者使用光照探針來模擬間接光的照明效果。
隨着技術的發展以及計算機計算能力的提高,也許在未來,我們能夠直接在游戲場景中進行動態的全局光照模擬也說不定呢。新版Unity3D中就已經出現了Realtime Global Illumination,雖然這個技術還處於雛形階段,所需要的計算量依然龐大,但確實為我們展示了一個令人激動的前景。
當然,技術是技術,產品是產品。技術是為產品服務的,再先進的實時全局光照系統,對於像素風格的游戲場景的提升也是幾近於0。
“選擇合適的技術來完善我們的產品和制作流程”,以及“根據現有技術來設計產品和制作流程”,說的其實是同一個意思。
1. 直接照明(Direct Lighting)
Unity3D中的直接照明主要來源於各種燈光物體,而燈光物體本質上是空物體加上燈光組件。直接照明可以產生陰影,但光線不會反射、也不會折射,但可以穿透半透明材質物體。

1.1 燈光類型(Lights)
Unity3D中默認可以創建這么幾種燈光:聚光燈、點光源、平行光、面積光,另外還可以創建兩種探針(Probe):反射探針(Reflection Probe)和光照探針組(Light Probe Group)。

平行光
平行光通常用來做陽光,Unity3D新建場景后會默認在場景中放置一盞平行光。平行光不會衰減。

Type
:燈光類型,所有類型的燈光都其實共用一個組件,本質上是一樣的。Color
:燈光顏色Mode
:燈光照明模式,每種模式對應Lighting面板中一組設定Realtime
:對應Realtime LightingMixed
:對應Mixed LightingBaked
:對應Lightmapping Setting
Realtime Lighting是新出現的一種烘焙光照技術,它並不像傳統的烘焙技術一樣直接烘焙間接光照顏色和亮度信息到光照貼圖上,而是烘焙物體和物體之間的關系信息,比如A面對B面有漫反射效果,B面對C面有漫反射效果等等。這樣一來,只要物體之間的關系不變(也就是所有的靜態物體都不移動位置),就不需要重新烘焙,從而使得我們可以在場景中隨意運用動態光源(dynamic lights)。而傳統的Lightmapping光照貼圖方式則不支持動態光源效果(改變光源不會改變場景光照)。Realtime Lighting比Lightmapping要更耗費系統資源,所以手游上就不要考慮了。
Intensity
:燈光強度Indirect Multiplier
:在計算該燈光所產生的間接光照時的強度倍乘Shadow Type
:陰影貼圖的類型No Shadows
:無陰影貼圖Hard Shadows
:硬陰影貼圖Soft Shadows
:光滑陰影邊緣(也就是陰影模糊效果)
Baked Shadow Angle
:烘焙陰影的角度Realtime Shadows Strength
:實時陰影強度Resolution
:陰影貼圖分辨率Bias
:陰影偏移,通常適當增加這個值來修正一些陰影的artifactNormal Bias
:法線偏移,通常適當減少這個值來修正一些陰影的artifact(不同於Bias
的使用場合)Near Plane
:陰影剪切平面,對於與攝影機距離小於這個距離的場景物體不產生陰影Cookie
:Cookie相當於在燈光上貼黑白圖,用來模擬一些陰影效果,比如貼上網格圖模擬窗戶柵格效果Cookie Size
:調整Cookie貼圖大小Draw Halo
:燈光是否顯示輝光,不顯示輝光的燈本身是看不見的Flare
:Flare可以使用一張黑白貼圖來模擬燈光在鏡頭中的“星狀輝光”效果Render Mode
:渲染模式Culling Mask
:
點光源
點光源模擬一個小燈泡向四周發出光線的效果,點光源在其照亮范圍內隨距離增加而亮度衰減

Range
:光線射出的范圍,超出這個范圍則不會照亮物體
聚光燈
聚光燈模擬一個點光源僅沿着一個圓錐體方向發出光線的效果,聚光燈在其照亮范圍內隨距離增加而亮度衰減

Spot Angle
:燈光射出的張角范圍
面積光
面積光模擬一個較大的發光表面對周圍環境的照明效果,通常面積光的燈光亮度衰減很快,陰影非常柔和。
Unity3D的面積光僅在烘焙光照貼圖時有效,並不像Maya的Area Lights一樣能動態照亮場景。

Width
:面積光寬度Height
:面積光的高度
總的來說,Unity3D中自帶燈光比較簡單,根據我們在Maya中使用燈光的經驗,可以很快熟悉這些燈光類型的使用。
1.2 陰影類型(Shadow)
Unity3D的燈光可以設置不同的陰影類型,分別是:無陰影、硬陰影、軟陰影。要注意的是,不論是硬陰影還是軟陰影,本質上都是用陰影貼圖模擬的陰影效果,而不是真實光照而自然形成的暗色區域。

燈光上陰影設置部分會隨着Mode
參數的不同而變化,Realtime Lighting Mode對應的選項很多,而Baked Mode僅對應Baked Shadow Angle一項。
無陰影
燈光不產生陰影,新建場景后默認生成的平行光就是無陰影的。
硬陰影
陰影邊緣清晰
軟陰影
陰影邊緣柔和,有過渡效果
陰影質量設置
雖然我們在燈光的陰影設置中可以調節Resolution以提高陰影質量,但真正的陰影質量調節應該在Quality面板中來進行,燈光中的陰影Resolution參數默認設置是Use Quality Settings,就是從Quality面板的設定中來選擇。

從菜單Edit
> Project Settings
> Quality
打開Quality面板,這里可以針對不同質量等級設置不同的參數。

我們現在先不在這里對Quality面板做全面介紹,僅介紹關於陰影的那一部分設置內容:
Shadows
:在當前質量下是不渲染陰影,還是只渲染硬陰影,還是軟硬陰影都渲染Shadow Resolution
:在當前質量下陰影貼圖分辨率,這就對應了燈光面板中的Resolution參數。Shadow Projection
:陰影貼圖的投影方式,Close Fit方式會優化近處的陰影質量,缺點是運動狀態下可能會出現一些波動,Stable Fit方式不會有波動,但質量比較差
有的時候陰影貼圖會出錯,比如無緣無故多出一條亮縫之類,通常可以選擇切換到
Close Fit
方式來解決,如果不想切換的Close Fit
方式,可以適當降低燈光陰影參數中的Normal Bias
參數,或者將對應場景物體設置成雙面顯示。
Shadow Near Plane Offset
:很近處不渲染陰影Shadow Cascades
:陰影貼圖疊加方式,可以是單層、2層或者4層Cascade Splits
:不同層所對應場景區域的比例分配划分
![]()
Shadow Cascades
是一種陰影貼圖算法,比如我們選擇4層疊加,那么實際上會計算4次陰影貼圖,每次對應距離攝影機一定距離范圍以內的場景物體,而這個距離范圍的划分就通過Cascade Splits
中所顯示的紫、綠、黃、紅四種顏色區域所占比例來區分。紫色代表最近處的區域,而紅色代表最遠處的區域。紫色條越窄代表其對應的那一層陰影貼圖所對應的場景區域越小,這樣一來該區域的陰影貼圖精度就很高了。
我們可以看到這里的Shadow Resolution就對應了燈光面板中的Resolution參數。

1.3 渲染路徑(Rendering Path)
Unity3D提供兩種渲染路徑(Rendering Path),對於初學者來說,渲染路徑這個概念不是很好理解,大家可以理解成是兩種不同的渲染器,分別有利弊就好了。
1.3.2 Forward
在Forward渲染路徑下,每個物體會被每個光源渲染成一個“通道”,因此物體受到越多燈光的影響,其渲染次數就會越多。
Forward渲染路徑的優勢在於,在燈光比較少的情況下,Forward方式的渲染速度會非常快,處理透明貼圖也非常快,還可以使用諸如“多重取樣抗鋸齒(MSAA)”這樣的硬件處理技術技術。
但Forward渲染路徑的渲染速度會隨着燈光的增多而迅速變慢,在一些有很多燈光照明的特定場景中(比如高科技室內環境)並不適合使用Forward渲染路徑。
1.3.1 Deferred
使用Deffered渲染路徑,渲染時間不會隨着燈光的增多而提高,而是會隨着受整體光照影響區域的擴大而提高(也就是說,場景中越多像素被照亮,渲染速度就越慢,但全屏被照亮的情況下,燈光設置復雜度不會進一步影響渲染速度了)。
Deffered渲染路徑在整體上需要更多的計算量,對於一些移動設備,Deffered渲染路徑還不能支持。
新版Unity3D的默認渲染路徑是Deffered渲染,如果場景非常簡單,或者希望使用MSAA,可以自行修改成Forward渲染路徑。
2. 間接照明
間接照明有這么幾種來源:
- 天光,也就是環境光(Ambient Light),特指來自於天空的漫反射。在Unity3D中可以繼承“天空球”的顏色作用環境光顏色,也可以自行指定環境光顏色。
- 反射光,特指天空漫反射之外的所有環境漫反射。在Unity3D中主要通過光照貼圖或燈光探針來模擬。
- 自發光物體。在Unity3D中自發光物體本身的亮度僅使用顏色來模擬,自發光物體對於環境的影響則通過光照貼圖或燈光探針來模擬。
2.1 天空盒(Skybox)與環境光(Ambient)
Unity3D的天空盒類似於Maya中的天空球的概念,都是在場景外圍生成一個封閉並正面向內的環境,用來模擬天空的顏色和照明效果。但Unity3D的天空盒采用的是Box形狀的天空環境而非球形,用6張不同的貼圖而非1張全景貼圖來作為天空貼圖。
我們可以將Maya中常用的全景HDR環境貼圖轉換為適用於Skybox的方形貼圖,來創建我們自己的Skybox。這種轉換可以在貼圖設置中完成:
![]()
將
Default
類型的貼圖的Texture Shape
從2D
改為Cube
,然后修改Mapping
為6 Frames Layout (Cubic Environment)
,點擊Apply
就可以了。
Skybox的貼圖都是高動態顏色深度的.exr
圖片格式(也就是俗稱的HDR圖片)。最好不要使用.jpg
或者.png
這種傳統8位色深的圖片來做Skybox,除非我們確認不需要對場景進行貼圖烘焙(這樣的話天空盒就只起到環境貼圖的作用了)。
簡單的場景(或者刻意追求一種純粹的效果)可以不使用Skybox而使用純色天空,甚至游戲不需要看到天空的,可以直接設置成None。
天空盒對於場景的照明影響主要來源於其對於環境光的影響。天空盒貼圖所產生的環境光肯定比純色環境光要更為豐富,也更為契合天空顏色一些。
環境光所需要的計算量很小,所以是很有效的照明手段,大家不要忽視了。
2.2 光照貼圖(Lightmap)與烘焙(Baking)
簡單來說,Lightmap就是用貼圖來模擬全局照明的效果,但當今游戲引擎的Lightmap的功能卻遠遠不是一張貼圖那么簡單。按照官方的說法,Lightmap中不僅可以包括物體表面的光照顏色信息(傳統的Lightmap功能),還可以包括物體和物體之間的光線滲透關系信息(新版中的Realtime Lighting功能),也就是說,動態光源也可以對於烘焙了光照貼圖的靜態場景物體產生正確的光照。
光照貼圖需要將所有參與的場景物體的UV重新排列組合成互不重疊且盡量少形變的方形結構,然后再把光照信息烘焙到一張或幾張較大尺寸(最大到4K)的貼圖中。這些烘焙好的貼圖會被儲存在場景文件所在目錄下與場景文件同名的子目錄中,所以烘焙光照貼圖之前需要保存場景。
光照貼圖烘焙參數設置

Environment:關於環境的參數設置
Skybox Material
:設置天空盒材質Sun Source
:設置太陽,可以指定一個平行光作為太陽,然后該平行光的旋轉角度會影響其亮度和顏色- Environment Lighting:關於環境光照的設置
-
Source
:環境光照來源
-Skybox
:來源於天空盒
-Gradient
:來源於一個從地平線到穹頂的顏色漸變
-Color
:來源於單色 -
Intensity Multiplier
:環境光照明強度強化 -
Ambient Mode
:環境光照明模式
-Baked
:烘焙在光照貼圖中
-Realtime
:實時 - Environment Reflections:關於環境反射的設置
-
Source
:環境反射來源
-Skybox
:來源於天空盒
-Custom
:來源於一個自定義的Cubemap(方盒貼圖) -
Resolution
:環境反射貼圖分辨率 -
Compression
:是否壓縮環境反射貼圖 -
Intensity Multiplier
:環境反射強度強化 -
Bounces
:環境反射計算次數
Realtime Lighting:關於實時光照烘焙的設置
-
Realtime Global Illumination
:是否進行實時光照烘焙
Mixed Lighting:關於混合光照烘焙的設置
-
Baked Global Illumination
:是否進行混合光照烘焙 -
Lighting Mode
:光照模式Baked Indirect
Distance Shadowmask
Shadowmask
Subtractive
Lightmapping Settings:關於光照烘焙的通用設定
-
Lightmapper
:選擇光照烘焙器-
Enlighten
:這是常用的一種烘焙器 -
Progressive (Preview)
:這是新版的一種烘焙器,還處於預覽狀態,它會先烘焙攝影機可見區域,再烘焙其他區域,所以預覽較快
-
-
Indirect Resolution
:間接光照分辨率(每單位長度多少體素(texel)),數值越高,光照細節越高 -
Lightmap Resolution
:光照貼圖分辨率(每單位長度多少體素),通常設置為Indirect Resolution
的10倍左右 -
Lightmap Padding
:修正兩個物體的Lightmap之間的距離,以避免顏色滲透 -
Lightmap Size
:光照貼圖大小(最大4096) -
Compress Lightmaps
:是否壓縮光照貼圖 -
Ambient Occlusion
:是否烘焙環境光遮罩 -
Final Gather
:是否對最后一次GI光線反射后的光照結果再進行一次FG計算,勾選上會有較好的質量表現,但烘焙時間會增加 Directional Mode
-
Indirect Intensity
:間接光照的強度 Albedo Boost
-
Lightmap Parameters
:設置詳細的光照貼圖參數(可以使用幾個默認值,或者創建新設置,應該是給熟手用的吧)
Other Settings:其他設置
-
Fog
:添加場景霧效-
Color
:霧效顏色 -
Mode
:霧效衰減模式 -
Density
:霧效密度
-
設置完成后別忘了點擊
Generate Lighting
按鈕烘焙光照貼圖!
光照貼圖的烘焙(baking)是很需要時間的,新版Unity3D提供了自動烘焙的功能:Auto Generate
選項,可以讓我們在調試場景的時候無需頻繁手動點擊Bake按鈕,但自動烘焙的結果並不會被儲存起來,所以最終發布前還是需要手動烘焙光照貼圖的。
注意,從名字上,很容易將“自動烘焙”和“實時全局光照”這兩個設置等同起來,這是非常大的誤解。
定義光照貼圖比例
既然所有的場景物體都被Pack成一個大的貼圖,那么一個多邊形面片上的光照信息精度就受限於這個多邊形面片所對應的UV在貼圖中所占據的面積大小了。出於場景優化考慮,我們當然希望將有限的光照貼圖面積盡量多的分配給更需要的物體咯,所以Unity3D在Mesh Render組件中提供了修改物體所占光照貼圖比例的參數:

-
Scale In Lightmap
就是控制該物體的UV在Lightmap的重排中比例縮放的,數字越小占比越少。
怎么決定哪些物體的UV占比低哪些物體的UV占比高呢?通常遠景物體占比比近景物體低,表面很平滑的物體占比比表面細節豐富的物體占比低,處於內部不太可見的模型占比通常要盡量低,地面或者地形這種很大面積的物體,占比中等就好了,否則就擠占了其他物體的燈光貼圖細節了。
2.3 燈光探針(Light Probes)
光照烘焙對於動態物體(Dynamic Object),也就是沒有被設置成Lightmap Static的物體來說都是不起作用的,如果希望動態物體也能被正確的照明,則需要創建Light Probe Group。
Light Probe可以被認為是在場景中的一個小“光源”,而多個Light Probe組成的網絡,就是Light Probe Group。這些小光源通過烘焙得到場景中該點的亮度信息,然后整個網絡用這個信息來照明動態物體。
同一時間內只會有最靠近動態物體的那些Probes會起作用,而且Light Probe離運動物體越近,其照明效果越強。我們可以根據場景光照環境特征來設置合適的Light Probe Group。
為場景添加Light Probe Group可以很好的將動態物體與靜態場景融合,尤其是在光照環境復雜的室內場景中,尤其需要添加Light Probe Group。
3. 如何提高圖像的渲染質量
Unity3D中圖像質量是由很多因素共同決定的,而且默認的參數設置常常都不是最佳的。而我們在制作游戲的時候,需要在游戲運行效率和游戲畫面質量上做出選擇。
有些游戲(比如2D游戲)的游戲畫面基本與渲染質量無關,這時候就可以關閉一些影響性能的功能或選項來提高運行效率。
但有些游戲(比如3D游戲,或者仿真應用如虛擬樓盤效果圖之類)對於圖像渲染質量有較高要求,我們也需要知道可以通過哪些手段來增強畫面效果,同時明白這樣做會犧牲多少運行性能。
設置質量等級(Quality Level)
Unity3D允許用戶設置多個質量等級,並在各個等級中運用不同的質量參數,前面講陰影的時候涉及過這方面的內容。
對於新手來說,常常會犯錯的地方是明明設置好了高等級的圖像質量,卻在較低等級預覽場景,或者明明需要輸出成WebGL(默認使用中等質量等級),卻不停地調整最高質量等級的參數。
選擇渲染路徑
簡單來說,Deferred渲染路徑的圖像質量比較高,但Forward渲染路徑在燈光不多的情況下速度比較快。
陰影質量
陰影出現Artifacts的時候請調整Bias
參數和Normal Bias
參數。
復雜場景的陰影質量需要手動調整Cascade Splits
參數中多個層的占比,以保證近處陰影有足夠的質量。
光照准確性
使用反射探針(Reflection Probe)
Unity3D中並沒並真實的Raytrace反射,而是通過反射貼圖來模擬所有的反射效果。
如果我們在場景中放置一個非常強反射的小球,我們就能看到這個小球上實際反射的是我們的Skybox,完全不會反射場景物體。這樣一來不僅影響到場景中反光物體的反射正確性,同時也會嚴重影響整體場景的光照准確性。
我們可以為場景添加Reflection Probe
來矯正不正確的反射貼圖。
Reflection Probe可以看做是一個帶有6個攝影機的點,它會渲染該點的6個方向(前后左右上下),將渲染結果拼成一個Cubemap,並應用給一個特定方框范圍內的所有物體作為反射貼圖。
對於比較復雜的環境,比如有多個區域的大房間,我們可以放置多個Reflection Probe並手動設置其影響范圍。

Reflection Probe默認不會計算動態物體,僅計算烘焙物體,我們可以修改屬性讓其將動態物體也包括在內,同時還可以修改屬性為Every Frame
使其每幀更新以准確反射動態物體的運動過程,還可以增加Lighting Setting中的Reflection Bounces提高反射次數(這樣就不會出現強反射物體在另一個反射物體中是黑色的情況了)。但要注意,這些修改都會占用更多的系統資源,尤其是每幀更新反射貼圖這樣的設置。
4. 如何提高烘焙效率
烘焙效率雖然不影響最終游戲的表現,但對我們制作過程有很大的影響。沒人會希望每次修改了場景布局或者燈光布局之后都要花費幾個小時甚至幾十個小時的時間來烘焙光照貼圖。
一個小技巧是不要將所有物體都設置成Lightmap Static參與光照貼圖的烘焙。很多細碎的物體(比如地上的小碎石)並不需要很精確的間接光照效果,而且也可能根本沒有足夠的光照貼圖精度來對應這些細碎物體,這時候用燈光探針可能比用光照貼圖更有效率。
在Unite 2017關於燈光烘焙的專場演講中,演講者通過將細小物體設置為動態物體,並添加簡單的Light Probe,讓渲染時間從3.5分鍾下降到20秒。
![]()
![]()
作者:shimmery
鏈接:https://www.jianshu.com/p/7594b044e6dc
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。