最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

從零開始獨立游戲開發(fā)學習筆記(四十四)--Unity學習筆記20-- Creative Core3上

2022-05-29 19:46 作者:oyishyi  | 我要投稿

5/27:怎么回事,愛言葉 IV?這么快就出了。但仔細一看,III 居然已經(jīng)是 4 年前的事情了,時間過的是不是太快了啊。歌詞里的各種串燒一點情懷都沒有,串燒的歌我可是一直聽到現(xiàn)在的啊。

5/29:學這個系列容易犯困。

所以今天我們要來學習 Creative Core 的第二部分 -?光照。

1. 光照基礎

1.1 判斷下圖場景中有哪些光源

  • 其實有三種:路燈,霓虹燈,和天空光。

1.2 光照是如何工作的

在 Unity 中,光照是對現(xiàn)實光照的模擬。即使你想做一個不遵循現(xiàn)實物理規(guī)則的光照效果,了解其在 unity 的工作模式也有助于你修改其表現(xiàn)。

1.2.1 光源的屬性


所有的光照都有一個光源,所以我們先捋一捋光源的一些屬性:

光源有三個關鍵屬性:

  1. 形狀:光源的形狀會影響光照的方向。

  2. 大?。汗庠吹拇笮绊懝庹沼绊懙降膮^(qū)域。

  3. 強度:光源的強度會影響光線能傳播多遠,以及有多亮。

上圖中的兩個光源的對比:

  1. 路燈的形狀使其方向單一,且呈現(xiàn)一個圓形。月亮則是呈現(xiàn)一個球體發(fā)散的方向。

  2. 路燈比較小,因此只影響到小部分區(qū)域。月亮會影響整個地面。

  3. 但是路燈的強度足夠讓其照射的區(qū)域很亮。月亮的強度很高,但不夠高,因為離地面太遠。

1.3 我們?nèi)绾胃兄饩€

為了模擬光線,我們有一個光源 source,以及一個感受器 sensor(人眼,照相機等等)。

我們看到物品,是因為光線照在物體上,反射到人眼上,或者照相機的底片里。

1.4 如何改變光線的方向

光線有兩種改變方向的方式:

  • 反射

  • 折射:白光只是一系列的光譜組合,當白光通過三菱鏡后,不同顏色的光譜因為折射度不同被分開,我們就看到了彩虹。

在本教程中,主要集中于反射。

2. Unity 光照起步

打開教程演示項目,進入戶外場景。我們這里選擇上方工具欄里的 window->rendering->light explorer

這里可以看到場景中燈光的一些重要屬性,以及可以在這里進行一些調(diào)整。 (一般建議是把這個 tab 放在左下角的布局)

然后,我們再看另一個窗口 window->rendering->lighting。

在這里,我們可以在 scene level 上進行設置。 (一般建議是放在右邊,inspector 的附近)

2.1 直接光和間接光的區(qū)別

直接光就是光線從光源里出來,只經(jīng)過一次反射后,到達 sensor。
間接光就是一些反射多次的光線,或者非太陽直射的天空光(因為已經(jīng)在云層里反射過了)。

2.2 全局光照(Global illumination,也稱 GI)

在游戲引擎中,全局光照包含直接光和間接光,用于模擬真實光照。

Unity 中有兩種 GI 系統(tǒng):烘焙 GI 系統(tǒng)和實時 GI 系統(tǒng)。(才怪,接著看吧)

2.2.1 烘焙 GI 系統(tǒng)


烘焙 GI 系統(tǒng)包括:

  • Lightmapping(光照貼圖):看名字也知道這和貼圖相關。其實原理很簡單,就是預先計算好光照的信息(也就是場景上各表面上光照的強度等信息),儲存在 texture 上,這個 texture 就叫做 lightmap。Unity 的 GI 系統(tǒng)有一個專門的 lightmapping 系統(tǒng)叫做 progressive lightmapper(漸進式光照貼圖,也稱 PLM)。

  • Light Probes(光照探針):光照貼圖是完全靜態(tài)的,而光照探針則是用來處理部分動態(tài)的光照效果。

  • Reflection Probes(反射探針):用于模擬更真實的反射。

unity 里所有的 pipeline 都支持烘焙 GI 系統(tǒng)。

2.2.3 實時 GI 系統(tǒng)


Unity 目前根本沒有一個成熟的實時 GI 系統(tǒng)。我就說教程寫的這么模糊,各種已廢棄,或者廢棄后又重新?lián)炱?,卻又加了一句 2024 年前還要再次廢棄是在搞什么。官方手冊含糊其辭,網(wǎng)上也找不到說法。結(jié)果搞半天根本就沒有一個成熟的系統(tǒng),只有一個不知道會不會被廢棄的功能。

現(xiàn)在確實是有一個叫做 enlighten real-time GI 的功能,不過這個功能即將在 2024 LTS 廢棄?,F(xiàn)在有,只是為了在替代品出來之前,讓你能用上實時的間接光照而已。

2.2.4 注意 enlighten real-time GI 和 enlighten baked GI 的不同:


前者是這個東西:

  • 沒錯,根本就沒寫 enlighten 這個單詞,但是官方手冊上叫這個功能為 enlighten real-time GI,非常迷惑。

不開啟的話,unity 就只會計算實時的直接光照,開啟的話 unity 就會自動計算實時的間接光照。此外,開啟這個之后,light probes 的一些表現(xiàn)也會發(fā)生變化,等等。

(但是呢,這個功能即將在 2024 年廢棄,可能 unity 官方覺得自己能在那之前做出一個類似于 虛幻5 的 lumen 那種全局光照系統(tǒng)出來吧)

后者則是 enlighten lightmapper:

這個玩意已經(jīng)早就廢棄了,留在這里只是為了一些兼容性考量。(HDRP 直接就刪了)

你可真會起名字啊,unity。(辱罵)

real-time GI 和 lightmapper 沒有沖突關系


當你勾選了 real-time GI 之后,只是會改變一些光照表現(xiàn)行為諸如動態(tài)的間接光照,以及 lightmapper 里的 light probes 的表現(xiàn)等,具體請看手冊。

real-time lighting 和 baked lighting 又是另一個東西


即使我們不勾選 (enlighten) real-time GI,在 unity 中仍然同時包含 real-time 和 baked 光照。就像剛剛提到的,即使在 baked GI 系統(tǒng)中(也就是不勾選 (enlighten) real-time GI),雖然沒有實時的間接光照,但我們有實時的直接光照啊,這依然是 real-time lighting,只不過系統(tǒng)不是 real-time GI。

也就是說 real-time lighting 與 baked lighting,和 GI 沒有關系。GI 是對一個整體光照系統(tǒng)的表現(xiàn)的設置(所以叫全局)。real-time lighting 和 baked lighting 則是具體到實際游戲的時候的表現(xiàn),只是用于描述光照的信息在什么時候計算而已。

unity 里,不同物體可以應用不同的計算方式,可以有的用 real-time lighting,有的用 baked lighting。

2.3 real-time lighting 和 baked lighting

unity 里,real-time lighting 指那些在運行時計算的光照,每一幀都會重新計算光照信息。因此移動物體的時候,光照效果也會跟著改變。

但是 real-time 的性能消耗較大,因此有些情況我們會提前計算好光照信息,存儲在 lightingmap 上。運行時直接使用即可。

把光照信息儲存為 lightmap 這一行為叫做烘焙(baking 或者 lightmapping)。在現(xiàn)版本的 unity 中,我們使用 PLM(progressive lightmapper)來計算光照貼圖。

不過問題在于光照效果并不會發(fā)生變化,移動光源,光還照在之前的地板上。

3. directional light(定向光) 和 skybox(天空盒子)

當我們新創(chuàng)建一個 unity 項目的時候,sampleScene 里可以看到一個藍色的天空,此外,場景中有一個物體叫做 directional light。

3.1 光源的種類

照明設計的一個初始步驟是識別光源的種類,光源分為:

  1. 自然光(natural lighting):通常是太陽或者月亮。

  2. 模擬照明(motivated lighting):模擬真實物理世界的光。如路燈,車頭燈等。

  3. 主光照(key lighting):通常不知道光源是啥,但是聚焦于場景中某個處于焦點中的物體上。(也就是攝影中的主光燈)

  4. 環(huán)境光(ambient lighting):在 unity 里也被叫做 diffuse environmental lighting。也是來自于一個不確定光源的光。

還有更多種類的光,但本教程只涉及這幾類,在設計照明的時候,可以從這幾個角度出發(fā)來想。(可以參考影視照明)

3.2 配置定向光

實際上,directional light 正是模擬自然光,模擬太陽光和月亮光的。

之所以叫定向光,因為光線全都是平行的直線,正如太陽光一樣(雖然太陽本身是個點光源,但是由于太大了,照在地球上就是個平行光線)

gizmos 上也展示出了這一平行的特性,還會告訴你光線的朝向:

  • 定向光線的位置是無所謂的,結(jié)果都一樣,畢竟是自然光。

  • 不過方向是有用的,可以改變光線的方向。

3.3 一些高級用法

定向光也有一些別的用法,諸如多個定向光,晝夜交替等等,這些不會在本教程中涉及到。

3.4 天空盒基礎

在 unity 中,天空背景使用的是一種特殊的材質(zhì)來創(chuàng)建的,叫做 skybox。skybox 是在不同面上有著不同的 texture 的立方體。

當你選擇用 skybox 來渲染天空的時候,unity 會先把整個場景放在一個立方體中。unity 會最先渲染這個立方體,因此場景中的所有東西都被渲染在 skybox 前面(所以 skybox 能作為背景)。

unity 盡管只提供了一個藍色的天空,但你可以讓其包含一些遠景特征來增加深度和空間感,諸如:

  • 背景里放一些遠處的山水。

  • 放一些建筑物。

skybox material


skybox 的材質(zhì)比較特殊,需要使用專門的 skybox shader,skybox shader 分為兩類:

  • Textured:使用一個或多個 texture 來生成 skybox。

  • Procedural:使用材質(zhì)上的屬性來生成 skybox。

3.5 創(chuàng)建一個新的 procedural skybox

這里我們創(chuàng)建一個自己的 skybox 來試試:

  1. 創(chuàng)建一個 material。

  2. shader 改為 Skybox Shader/Procedural。(其他 3 個都屬于 Textured 類)

  3. 賦予給 lighting->environment->skybox material。

然后我們來調(diào)整各個屬性來看看其表現(xiàn):

  • sun:可以看到天空中有一個太陽,這個屬性只會影響這個太陽的大小,并不會影響光照效果。

  • atomosphere density:大氣層密度,這個屬性越高,大氣層吸收的光線就越多。

  • color tint 和 Ground:改變天空和地面的顏色。

  • Exposure:調(diào)整天空盒的曝光,越高就越亮。

4. 添加其他光源

剛剛我們創(chuàng)建了自然光,現(xiàn)在我們要給場景中添加一些其他光源了。

4.1 點光源和聚光燈 motivated lighting

這里介紹另外兩種光源類型:point light 和 spot light。效果很明顯,拖出來看一看就知道。前者是個發(fā)散的光源(如燈泡等),后者是一個圓錐型(如舞臺燈,手電筒)。

一些屬性的效果:

  • range:光線能傳播到多遠。

  • itensity:有多亮。

  • indirect multiplier:間接光每次反射后強度的改變。如果低于 1,則每次反射后強度會變低(這也是真實世界的情況),如果高于 1,則每次反射后強度會變高。(不符合真實物理規(guī)則)

  • color:顧名思義。

4.2 光和顏色如何運作

讓我們來看看光和顏色運作的物理科學。

4.2.1 我們?nèi)绾胃兄伾?/h1>


雖然這些都是初中學過的。但不妨再回憶一下。

太陽光是白色的,而這是所有光譜顏色混合在一起,被人眼感知的結(jié)果。而一個黃色物體,是因為它吸收了除了黃色光以外的所有顏色。

4.3 檢查色彩空間

如果出現(xiàn)燈光的亮度不成比例的話,可以去檢查是否為線性色彩空間。
URP 中,默認是線性色彩空間。
普通模板中,是 gamma 色彩空間。

gamma 色彩空間是對人眼進行調(diào)校的結(jié)果,而線性空間則是更精確沒有校正的結(jié)果。具體可參閱手冊。

切換色彩空間


Edit->Project Setting->Player->Other Setting->Color Space。

4.4 配置環(huán)境光

環(huán)境光是沒有特定來源的光。Unity 的環(huán)境實時光照會被計算存儲在 lightmap 里。

前往 lighting -> environment ,之前我們在這里設置過 skybox material?,F(xiàn)在我們關注 environment lighting。

skybox 環(huán)境光


可以看到 environment->source 現(xiàn)在被設置為 skybox,這表示環(huán)境光由 skybox 提供。這一做法一般來講簡單有效。

下面的 intensity mutiplier 可以調(diào)整環(huán)境光的強度。

注:物體想要被計算環(huán)境光貼圖,需要事先被設置為 static 才行。因為要保證在運行的時候不會亂動。

gradient 環(huán)境光


將 source 改成 gradient。

  • sky color:天空的環(huán)境光,影響物體上方的光照顏色。

  • equtor:附近的環(huán)境光,影響物體周圍的光照顏色。

  • ground:地面的環(huán)境光,影響物體下方以及周圍的光照顏色。

color 環(huán)境光


簡化的 gradient 環(huán)境光,影響物體所有表面的光照顏色。

5. 配置場景中的陰影

陰影和光照如影隨形。

5.1 配置 render pipeline asset

在 unity 中,所有的陰影被儲存在一個叫做 shadow map 的 texture 里。這個 texture 的分辨率越高,則陰影越清晰。當游戲渲染的時候,陰影會被渲染在畫面之上。

我們首先去在 render pipeline asset 里設置陰影的總體效果:

來看一下這些配置:

  1. max distance:顧名思義,就是設置陰影離照相機多遠的時候才會被渲染。越大,畫面中陰影就會越多,越小就越少。除了性能考量,還會有一些特殊 artstyle 的需求。暫且不表。

  2. 最下面有兩個 bias,depth bias 和 normal bias,這兩個是為了解決陰影失真的情況(shadow acne)。有時候陰影和光照的位置并不對,或者會有陰影中夾雜著光照的情況,這種情況叫做陰影失真,具體可以參考這個知乎問題。

  3. soft shadows:勾選后,會進一步處理陰影,讓陰影看起來更平滑。不過現(xiàn)在設置不一定能看到效果,為什么要下一小節(jié)再講。

  4. cascade count:這個屬性控制 shadow cascade(陰影級聯(lián))的數(shù)量。攝像機近處的陰影比遠處的陰影分辨率更低,會有一些明顯的鋸齒產(chǎn)生,這一情況被叫做透視陰影(perspective aliasing)。解決這一現(xiàn)象的方式就是 shadow cascade。增加 cascade count 可以有效改善近處陰影的分辨率。(不過陰影級聯(lián)只對定向光有效)

陰影級聯(lián)(shadow cascade)


我們再細講一下陰影級聯(lián)吧。也可以參閱 unity 手冊上的該部分。

B 處比 A 處鋸齒更多。這是因為這兩個地方用的是同一個陰影分辨率。當然,你可以直接通過增加陰影的分辨率來完成這一效果,不過這樣性能消耗就比較大,因為遠處用不到這么高的分辨率。

在說解決方案之前,我們來解釋一下這個現(xiàn)象的原因。
這是因為在 unity 中,我們的攝像機是應用了透視效果的視椎體。也就是近大遠小。遠處的大物體和近處的小物體是一樣的尺寸,如下圖:

上圖顯示的是實際場景的尺寸大小,可以看到這個球非常大,攝像機的視椎體投射到后面的時候已經(jīng)非常寬了。讀者可以試想一下現(xiàn)在攝像機屏幕的樣子是什么樣的,實際上,上圖紅色實現(xiàn)部分的梯形中,左邊和右邊在攝像機眼里是一樣的長度的。

  • 首先我們要知道,這一幀,攝像機會并根據(jù)設置的陰影分辨率來讀取陰影貼圖,然后渲染到畫面上。

  • 然而,上圖中可以看到(假設背景的格子是陰影貼圖),遠處的地方讀取了 20 個格子的陰影數(shù)據(jù)。因此效果非常好。而近處只讀取到了 4 個格子的陰影數(shù)據(jù),因此很模糊。(因為在屏幕中都是一樣的大小,你把 4 個格子部分的陰影放大 5 倍來看,自然分辨率就會很低了)

解決這一問題的其中一種方案是使用 soft shadws 或者增加陰影分辨率:

  • 也就是把以上的格子直接增加 5 倍密度,讓 4 個格子的部分擁有之前 20 格子的質(zhì)量,當然就能解決。不過還是那句,這樣性能消耗過大。遠處根本不需要這么高的分辨率。

  • 左邊近處部分應用了更高的分辨率。

  • 這也是可以理解的,近處的物體自然需要更高的分辨率來提高真實感。

  • 提高級聯(lián)數(shù)量(cascade count)會增加分割份數(shù),會更真實平滑,當然也會提高性能消耗。不過無論如何,這也比直接提高總體陰影質(zhì)量要好。

總結(jié)

雖然理論說的很復雜的樣子,但實際上很好理解。把一個分辨率低的圖縮小就會感覺比較清晰(對應在游戲中,就是屏幕遠處的地方)。因此我們讓遠處的圖分辨率還是那么低,但是近處的圖分辨率提高。

陰影級聯(lián)(shadow cascade)

我們再細講一下陰影級聯(lián)吧。也可以參閱 unity 手冊上的該部分。

首先我們看一下透視陰影的表現(xiàn):

B 處比 A 處鋸齒更多。這是因為這兩個地方用的是同一個陰影分辨率。當然,你可以直接通過增加陰影的分辨率來完成這一效果,不過這樣性能消耗就比較大,因為遠處用不到這么高的分辨率。

在說解決方案之前,我們來解釋一下這個現(xiàn)象的原因。
這是因為在 unity 中,我們的攝像機是應用了透視效果的視椎體。也就是近大遠小。遠處的大物體和近處的小物體是一樣的尺寸,如下圖:

上圖顯示的是實際場景的尺寸大小,可以看到這個球非常大,攝像機的視椎體投射到后面的時候已經(jīng)非常寬了。讀者可以試想一下現(xiàn)在攝像機屏幕的樣子是什么樣的,實際上,上圖紅色實現(xiàn)部分的梯形中,左邊和右邊在攝像機眼里是一樣的長度的。

那么,這種情況會造成什么問題呢?我們再考慮一下陰影貼圖的情況:

  • 首先我們要知道,這一幀,攝像機會并根據(jù)設置的陰影分辨率來讀取陰影貼圖,然后渲染到畫面上。

  • 然而,上圖中可以看到(假設背景的格子是陰影貼圖),遠處的地方讀取了 20 個格子的陰影數(shù)據(jù)。因此效果非常好。而近處只讀取到了 4 個格子的陰影數(shù)據(jù),因此很模糊。(因為在屏幕中都是一樣的大小,你把 4 個格子部分的陰影放大 5 倍來看,自然分辨率就會很低了)

解決這一問題的其中一種方案是使用 soft shadws 或者增加陰影分辨率:

  • 也就是把以上的格子直接增加 5 倍密度,讓 4 個格子的部分擁有之前 20 格子的質(zhì)量,當然就能解決。不過還是那句,這樣性能消耗過大。遠處根本不需要這么高的分辨率。

另一種方式就是使用 shadow cascade,其實就是講視椎體分成多個部分,提高近處部分的分辨率:

  • 左邊近處部分應用了更高的分辨率。

  • 這也是可以理解的,近處的物體自然需要更高的分辨率來提高真實感。

  • 提高級聯(lián)數(shù)量(cascade count)會增加分割份數(shù),會更真實平滑,當然也會提高性能消耗。不過無論如何,這也比直接提高總體陰影質(zhì)量要好。

總結(jié)

雖然理論說的很復雜的樣子,但實際上很好理解。把一個分辨率低的圖縮小就會感覺比較清晰(對應在游戲中,就是屏幕遠處的地方)。因此我們讓遠處的圖分辨率還是那么低,但是近處的圖分辨率提高。

5.2 設置定向光的 soft shadow

我們在 pipeline 里設置了 soft shadow,但是這個是一個全局的設置。具體到每個光源產(chǎn)生的陰影還是要各自配置的。也因此為什么剛剛勾選后,不是所有的陰影都改變了。

我們可以去到 directional light 里看看,有一個 shadow type 的選項:

可以看到我們給定向光設置的還是 hard shadow,自然全局開不開 soft shadow 和它也沒有關系了。我們改成 soft shadow,就可以看到軟陰影的效果。下面還可以看到一些別的設置,都是對單獨光源陰影的設置。

同理,也可以根據(jù)自己喜好單獨更改那些 motivated lighting 光源的陰影效果。

注:軟陰影雖然比起級聯(lián)陰影還是要多消耗性能,但比直接提高陰影分辨率還是要好一些的。如果對邊緣清晰度沒那么高的要求的時候可以開。

5.3 后處理(post processing)

就像是在拍照之后,發(fā)現(xiàn)照片與實際的顏色光照效果有區(qū)別,想要使用濾鏡來彌補或者提高表現(xiàn)力。這種就是后處理,不過現(xiàn)代照相機一般直接提供比較簡單的一鍵處理效果。如果用過 LR 這種軟件來處理相片的話,會知道專業(yè)的后處理其實包含很多種屬性的調(diào)整。

不過,具體的后處理之后會單開一篇文章來講,這里就不說了。

不過教程給的示例場景中已經(jīng)有一個叫做 postprocessing 的物體,可以點開看看試試。

6. 烘焙光照貼圖

之前我們做的都是實時光照,現(xiàn)在開始試著烘焙光照。這個學完之后,我們就學完了基礎的戶外光照知識了。
然后我們在稍微提一下實時光照和烘焙光照:

  • 實時光照會在每一幀重新計算,會根據(jù)光源的位置和物體的位置來計算。比較消耗性能。

  • 烘焙光照則是預先計算好光照,運行的時候 unity 無需計算,而只需要把貼圖映射到場景中。烘焙光照自然也無法動態(tài)地發(fā)生變化。

  • 計算光照的過程會為整個場景計算 UV 坐標(正如材質(zhì)映射紋理的 UV 坐標一樣)。這個特殊的紋理貼圖被稱為光照貼圖,這一過程叫做 lightmapping 或者烘焙(baking)。

烘焙光照不僅高效,也會生成更加逼真的光效。(間接光照有了)

6.1 改變燈光模式(ligth mode)

在 unity 中,light mode 也就是 baked,real-time,mixed 這三種。

如果是跟著示例項目走的,目前場景中所有燈光應該都是 real-time。

  • 去到定向光,把 light mode 改成 baked。

  • 你可能會想把其他光源也用同樣的方式改成 baked,但你還記得 light explorer 嗎?這個時候使用 light explorer 其實更加方便。

6.2 把光源改為 static

雖然 light mode 改成 baked 了,但此時你移動光源,發(fā)現(xiàn)還是實時的。我們還有兩步要走。

第一步是,如果要使用烘焙光照,首先我們要保證這個光源,以及照射到的物體不能移動,不然運行的時候就會露餡。因此我們需要把光源設置成 static。還有光源照到的物體也要同樣設置為 static。(其實只要是在運行時保證不會動的物體,都應該設置為 static,不只是光照計算,也可以避免做一些別的不必要的計算)

  • 把整個 environment 設置為 static。

  • 把所有光源設置為 staic。

6.3 烘焙

第一步走完了,依然看不到效果,因為我們現(xiàn)在還沒有開始烘焙呢,只不過是做好了烘焙的準備。

所以第二步就是正式烘焙光照了。

  • 開始之前,我們先在場景里放一個光源,不要改成 static。再創(chuàng)建一個非 static 的 cube,放在非 static 光源之下,用來對比。

然后正式烘焙:

  1. 點擊 lighting->scene->lighting settings->new lighting setting 創(chuàng)建一個新的光照設置。命個名,如 BakedLighting。

  2. 改變 Mixed Lighting->Lighting mode 為 baked indirect。

  3. 點擊下方的 generate lighting,等待一段巨長的時間,下方有進度條。(如果太慢的話,可以把 PLM 設置成 GPU)

  4. generate 之前檢查是不是該設置的都設置了,免得等半天發(fā)現(xiàn)一個物體忘了該 static 或者啥的,又要重來一遍。

6.3.1 測試:

  1. 移動靜態(tài)光源,發(fā)現(xiàn)光照還在原地。

  2. 移動靜態(tài)物體,發(fā)現(xiàn)光照永遠在物體的固定位置上。

  3. 移動之前創(chuàng)建的非靜態(tài)光源,發(fā)現(xiàn)光照是可以變化的。

  4. 觀察剛創(chuàng)建的 cube,因為沒有 static,雖然在光源下面,卻是一個全黑的樣子。(因為定向光也被我們改成 baked 了)

  5. 移動那個實時光源,發(fā)現(xiàn)這個光源可以照亮所有的東西,無論是不是 static。照在烘焙過光照的物體上會有光照疊加效果,只要不移動那個物體也不會顯得違和。

6.3.2 結(jié)論

根據(jù)上面現(xiàn)象可以得到以下結(jié)論(這個結(jié)論只討論在 baked 模式 + baked indirect 模式。如果是 mixed 模式效果會很復雜的):

  1. 光源被設置為 static,再點擊烘焙之后,光源就可以說沒用了,這個時候你把光源刪掉,光照效果都還在。

  2. 沒有設置 static 的物體上不會被烘焙光照貼圖,只能被實時光源照亮。

  3. 實時光源不管你物體是啥,都能造成實時光照效果。

可以說,烘焙光照的效果就像是把光源給掐滅了,然后在 static 物體上畫出一些亮光的顏色。

6.4 添加 area light

之前一直沒有提到 area light,是因為 area light 只能被烘焙。area light 的形狀是一個矩形或者圓形。

由于沒有實時效果,因此很難調(diào)整,可以打開 gizmos 來幫助判斷最后的效果。

6.5 mixed

light mode 里還有一種效果 mixed,也是之前一直不提。

mixed 如名字一樣,介乎于實時和烘焙之間。根據(jù)設置有不同的效果,在 lighting->mixed lighting->lighting mode 中可以更改。不同的模式效果在下面有說明。

  • baked indirect:就是之前烘焙的時候更改過的,現(xiàn)在知道為啥是放在 mixed lighting 下了吧。如果是 mixed 的光源,表現(xiàn)為實時的直接光 + 烘焙的間接光。如果是 baked 光源那就是全部烘焙光。這種模式適合中檔硬件。

  • subtractive:這種模式的話,mixed 光源同時烘焙直接光和間接光。但是如果光源下的物體是動態(tài)的話,會受到實時光照的效果,但是不會投射陰影,不過會有一個 directional light 投射下來的陰影。(表現(xiàn)為一個動態(tài)物體在一個 mixed 光源下,有實時光照,但是陰影卻不是這個實時光照的陰影,而是定向光的陰影),專門為定向光空出一個位置是為了不讓陰影顯得過于奇怪,有些時候這種表現(xiàn)手法也是可以接受的。如果物體是靜態(tài)的,那就和 baked 模式一個效果,當然靜態(tài)物體反正也不能動不需要實時陰影。讀者應該也能猜到,這種模式適合比較低檔的設備。

  • shadowmask:和 baked indirect 一樣,屬于實時的直接光 + 烘焙的間接光。但是會自動融合實時陰影和烘焙陰影。這種效果最真實,同時性能消耗最大。適合高檔設備。

還想了解具體信息可以參考手冊。不過只要遵循靜態(tài)物體不要動,以及了解不同模式適合什么檔位的設備,對于小項目來說足夠了。

7. 使用 light probes(光照探針)來改善光照效果

假設我們有一個靜態(tài)物體,我們首先想到的是使用烘焙光照。不過問題在于,物體是不動了,但你沒法確保沒有動態(tài)物體經(jīng)過這里啊,人走過,汽車開過都應該有投射。但是難道因此我們就要屈服,改成實時光照嗎?

不會,因為我們有 light probes。

7.1 什么是 lighrt probes

如果把光照貼圖理解為物體表面的顏色信息的話,那么 light probes 就是光源和物體之間那段空間的光照信息。有了這個信息,有物體穿過這個空間的時候,就可以計算出光照信息了。在游戲運行時,如果有物體經(jīng)過某個 light probe 附近(多個 probes 找最近的),那么就會用這個探針的信息來計算該移動物體的光照。

light probes 為什么有用

比起實時光照更高效,也更真實,又帶有不錯的動態(tài)光照信息(如果放置合理的話)。

light probes 一般用于靜態(tài)光源+動態(tài)物體的情況。不過如果有些場景光源改變很大的話,也很有用。玩家也不想看到光源變了,動態(tài)物體還不變。

7.2 light probes 放在哪兒呢?

light probe group 組成 light probe groups。每一個 light probe group 里又包含多個 light probe,每個 light probe 都包含它和它周圍的 light probes 之間的光照信息。

最簡單的方式是在你想衡量的光照空間內(nèi)(比如說路燈和其照射的范圍內(nèi)),組成一個普通網(wǎng)格形狀。這個網(wǎng)格應該至少包含兩個垂直層,因此也被成為 3D 體積。(3D Volume)。比如:

有了這么一個 light probe group,我們可以復制它,連在一起組成 light probe groups。

當然,不是說所有的 groups 都要一樣。完全可以獨立設定,某些地方可能光線變化比較大,就讓探針密集一點。

聽起來很復雜,也確實很復雜。但是可以幫助你有效地優(yōu)化光照效果。

7.3 放置 light probes

那么,我們要自己試著放置了。

  1. 在 hierarchy 里新建 light->light probe group。

  2. 移到能看的到的地方,可以改變位置大小啥的。

  3. 點擊 edit light probes(那個圖標)

  4. 選擇 select all,然后 deplicate selected,然后就可以拖動來擴展了。當然你要是愿意也可以一個一個拖。

  5. 我們讓其布滿我們想要抓取數(shù)據(jù)的空間。

  6. 記得要包裹住光源。

效果:

  • 有一個問題,球體的所有面都發(fā)光了,但按理來說背面不應該發(fā)光。

  • 我們可以嘗試取消勾選 remove ringing,這個勾選上有可能會導致探針信息不對。一般是在 ringing 現(xiàn)象出現(xiàn)的時候才會勾上。

下面這個是錯誤示范:

  1. 沒有光源的地方也有一大堆探針。

  2. 只覆蓋了光源周圍的空間,沒有覆蓋到下面的空間(光能照到的部分)。

  • 因此可以看到球體并沒有被照亮。把球體往上移動才會被照亮。

7.4 使用工具測試 light probes 的有效性

雖然拖一個球體來看也不錯啦。但是 unity 有專門提供工具來進行測試。

可以在 light explorer->light probes 里看到探針的狀態(tài)

還可以在 scene 上方的工具欄里切換 draw mode 為 contributors/receivers。(之前設置 wireframe 的時候用過)

不同的顏色代表不同含義寫在右下角。/ 左邊表示是否對 GI 有貢獻,/ 右邊表示是否接收 GI,如果有接收了哪里來的 GI。

看不到路燈是因為路燈和地面都是藍色,換個角度就能看見了:

7.4.1 顏色的含義

  • 黃色:因為球體是非 static 類型物體,對 lightmap 沒有貢獻。但是接收了 light probes 的光照信息。

  • 藍色:static 物體,會參與 lightmap 的計算,同時也會接受 lightmaps 的信息。烘焙過的物體正常來說都應該是這個顏色。

  • 紅色:該物體參與 lightmap 的計算,而且還能接收 light probes 的光照信息。

使用這個 draw mode 可以讓你更好地分辨出場景中存在的問題,光照是否按照你想的那樣運作。

7.5 其他光照設置

lighting-scene 窗口還有很多屬性我們沒用上,可以自己探索,以下是一些比較重要的屬性:

  • bounces:控制光照的最小和最大彈跳數(shù)。與間接光照有光,越多需要計算的也越多。

  • lightmap resolution:顧名思義,分辨率。和陰影分辨率一樣,越大越好。不過性能消耗也會越多。

  • albedo boost:提高反射率,雖然這個一般是我們在 material 上控制的。但是我們也可以在光照這里總體再提升一下。

  • indirect intensity:顧名思義,間接光的強度。

可以自己嘗試改變一下看看效果,此外,鼠標移到屬性上也會顯示這個屬性的解釋。不過基本上來說,增加光照效果的都會同時增加性能消耗,這點需要注意。


從零開始獨立游戲開發(fā)學習筆記(四十四)--Unity學習筆記20-- Creative Core3上的評論 (共 條)

分享到微博請遵守國家法律
阜新市| 稻城县| 昌平区| 武川县| 西盟| 石阡县| 定日县| 青海省| 滁州市| 安图县| 新源县| 富民县| 广饶县| 宁武县| 长武县| 汤阴县| 松江区| 茂名市| 沭阳县| 印江| 竹山县| 安吉县| 观塘区| 徐闻县| 花垣县| 屏边| 奇台县| 金溪县| 温泉县| 宽甸| 诏安县| 梁河县| 左权县| 株洲县| 志丹县| 高阳县| 汝州市| 金川县| 科尔| 资中县| 伽师县|