《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的
我其實(shí)很久以前就想做一篇正式的《塞爾達(dá)傳說(shuō):曠野之息》引擎分析文章了,但一直沒(méi)時(shí)間去弄。然而,現(xiàn)在Switch有了新的視頻錄制功能后,我想這是一個(gè)完美的時(shí)機(jī)來(lái)重游這款游戲并通過(guò)我上傳到Twitter上的視頻來(lái)分享我的想法(本文中以動(dòng)態(tài)圖與靜態(tài)圖代替)。
我將先從我的研究結(jié)果摘要開(kāi)始,但我也會(huì)在文章的后面對(duì)每一個(gè)技術(shù)特性進(jìn)行細(xì)分以便通俗易懂。同時(shí)我也會(huì)盡可能避免出現(xiàn)重復(fù)內(nèi)容。比如說(shuō)像是Digital Foundry這樣的已經(jīng)分析了引擎的一部分特性,那我就不會(huì)再在這里提及到了。這篇帖子的目的是為了讓更多的人接觸到其他人不打算費(fèi)心去調(diào)查的,游戲中的技術(shù)成就。
總之,這里就是這款引擎特性的總結(jié):
?
- Global Illumination | 全局光照 (更具體來(lái)講,是光能傳遞)
- Local Reflections | 局部反射 (由菲涅爾反射計(jì)算)
- Physically-based Rendering | 基于物理的渲染
- Emissive materials/area lights | 自發(fā)光材質(zhì)/區(qū)域光源
- Screen Space Ambient Occlusion | 屏幕空間環(huán)境光遮蔽
- Dynamic Wind Simulation system | 動(dòng)態(tài)風(fēng)力模擬系統(tǒng)
- Real-time cloud formation | 實(shí)時(shí)云體變形 (受風(fēng)力影響)
- Rayleigh scattering/Mie Scattering | 瑞利散射/米氏散射
- Full Volumetric Lighting | 完整體積光照
- Bokeh DOF and approx. of Circle of Confusion | Bokeh景深與模糊圈的近似值
- Sky Occlusion and Dynamic Shadow Volumes | 天空遮蔽與動(dòng)態(tài)陰影體
- Aperture Based Lens Flares | 基于光圈的鏡頭光暈
- Sub-surface Scattering | 次表面散射
- Dynamically Localized Lightning Illumination | 動(dòng)態(tài)局部閃電照明
- Per-Pixel Sky Irradiance | 逐像素天空輻照度
- Fog inscatter | 霧光散射
- Particle Lights | 粒子光源
- Puddle formation and evaporation | 水坑的形成與蒸發(fā)
Global Illumination/Radiosity | 全局光照/光能傳遞
首先我想要聲明一點(diǎn),所有所謂的實(shí)時(shí)全局光照方案都是以某種方式偽造出來(lái)的,都具有著不同程度的準(zhǔn)確性。任何僅僅因?yàn)闆](méi)有使用路徑追蹤之類(lèi)的而忽略了《塞爾達(dá):曠野之息》中的全局光照方案的人們應(yīng)該仔細(xì)想想自己究竟在說(shuō)些什么。最重要的一點(diǎn)是,這一切都是實(shí)時(shí)渲染的;這不僅僅是烘培入紋理中的光照,這對(duì)于一款開(kāi)放世界游戲來(lái)說(shuō)(尤其是在Wii U上)非常令人欽佩。
那么,光能傳遞到底是個(gè)什么東西?嘛,在3D圖形渲染中,它是從不同表面反射的光,并在這個(gè)過(guò)程中講顏色信息從一個(gè)表面?zhèn)鬏數(shù)搅硪粋€(gè)表面的全局光照近似法。光能傳遞越是準(zhǔn)確,為了傳輸適當(dāng)?shù)念伾托枰?jì)算更多的反射光。
在《曠野之息》中的引擎用的是光照探針在整個(gè)環(huán)境中收集在光照探針附近不同表面的顏色信息。并沒(méi)有什么模擬反射光,只是一個(gè)給定區(qū)域中基本顏色的一些近似值。《曠野之息》用于計(jì)算此信息的算法尚不清楚,但我的最佳猜測(cè)是球諧函數(shù)或之類(lèi)的東西,基于顏色平均值與光能傳遞局部化。與《超級(jí)馬里奧:奧德賽》不同,《曠野之息》中的光能傳遞并非二進(jìn)制而是粒子。從光照探針計(jì)算的照明信息似乎與LOD系統(tǒng)在同一個(gè)渲染管線(xiàn)層次捆綁串流,使得其效率極高。
觀察建議:注意當(dāng)相機(jī)靠近該區(qū)域時(shí),巖石懸崖是如何從草地上接收到綠色色調(diào)的。
?
(更新)起初我假設(shè)可能整個(gè)環(huán)境中都有放置球諧函數(shù)來(lái)收集色彩采樣,因?yàn)楫?dāng)林克在整個(gè)環(huán)境中移動(dòng)時(shí),它似乎會(huì)更新為基本顏色。然而,經(jīng)過(guò)進(jìn)一步調(diào)查后,我現(xiàn)在知道了那些基本顏色反射是由于環(huán)境中缺乏顏色變化。當(dāng)我在一個(gè)彼此相鄰的許多不同顏色表面的區(qū)域測(cè)試全局光照時(shí),其全局光照系統(tǒng)是如何運(yùn)作的就變得豁然開(kāi)朗了。注意林克在接觸紅墻時(shí),其顏色是如何傳遞到面向相反方向上所有表面上的。在紅墻相反方向的綠墻也是如此(盡管效果并不是很強(qiáng)烈,因?yàn)樘结樃拷t墻,因此紅墻的顏色本身反射更強(qiáng)烈)。事實(shí)上,在任何給定的點(diǎn)上,這在各個(gè)方向上都會(huì)發(fā)生。地面向上傳遞顏色,而林克頭部正上方的任何天花板或是彩色表面都會(huì)傳遞其顏色。探針不斷地動(dòng)態(tài)的采樣并傳遞顏色(我們可以認(rèn)為這就是反射光了),因?yàn)樘结槙?huì)因?yàn)樾碌膫鬟f而拾取更多的顏色,并且還必須對(duì)他們進(jìn)行采樣。最后,最終結(jié)果將會(huì)停止改變,因?yàn)樽羁拷结樀臉颖緦⒕哂凶钪饕念伾?無(wú)論顏色轉(zhuǎn)移量如何。這一過(guò)程井然有序,但非常局部化且速度相當(dāng)?shù)目臁L结樉哂杏邢薜牟蓸臃秶?并將這些結(jié)果應(yīng)用于世界空間中的材質(zhì)上。由于如此般的效率,探針能夠近似出許多反射光的效果,但只有在距離探針最近的區(qū)域中看起來(lái)準(zhǔn)確。
(更新)這是一個(gè)非常重要的發(fā)現(xiàn)。
?
全局光照實(shí)際上會(huì)近似多次反射。在林克的頭部上有一個(gè)光照探針可以對(duì)環(huán)境中的大多數(shù)材質(zhì)的色彩進(jìn)行采樣。然后,每一個(gè)采樣的顏色被傳遞并以相反的方向反射。有趣的是,強(qiáng)度有被考慮為因素,其受到探針最接近的表面以及反射光的強(qiáng)度影響。
在戶(hù)外可能看起來(lái)效果不太明顯,但是當(dāng)有多個(gè)相鄰的表面時(shí),全局光照的效果看起來(lái)很不錯(cuò)。
?
- Local Reflections | 局部反射
(更新) 那么,自從我開(kāi)始分析這款游戲以來(lái),總是讓我頭疼的一個(gè)區(qū)域似乎就是局部反射了。有著如此多看似不一致的情況,因?yàn)槲业睦碚撟畛鯘M(mǎn)天飛。現(xiàn)在我可以自信的說(shuō),我已經(jīng)解開(kāi)了局部反射是如何運(yùn)作背后的謎團(tuán)了。顯然,這是一種根據(jù)具體情況而三管齊下的方案。
?
- Specular Lighting | 鏡面光照
陽(yáng)光,天光,閃電,點(diǎn)光源都屬于此類(lèi)別。起初我以為神廟,塔也是如此(因?yàn)樗鼈兪亲园l(fā)光的,因此我就假設(shè)它們是區(qū)域光源),但看到神廟與塔所展現(xiàn)出的非常能夠揭露真相的加工痕跡(artifact)時(shí),就可以排除這一點(diǎn)了。不是所有發(fā)光的材質(zhì)都能夠照明環(huán)境,而神廟與塔可以歸屬于那些不能的發(fā)光材質(zhì)。
?
- Aperture mapped reflections | 光圈映射反射
如果這個(gè)術(shù)語(yǔ)對(duì)你來(lái)說(shuō)感到很新穎,那可能因?yàn)樗褪侨绱恕;谶@款游戲的文本轉(zhuǎn)儲(chǔ),《曠野之息》開(kāi)發(fā)人員標(biāo)記了他們對(duì)虛幻引擎4的場(chǎng)景捕獲2D反射的看法。環(huán)境是這樣反射出來(lái)的。林克頭部(明確來(lái)講,是光圈)上方的虛擬相機(jī)有著相對(duì)較小的視野,因此當(dāng)林克移動(dòng)時(shí)就會(huì)使得反射(實(shí)時(shí)顯示)在它們適當(dāng)?shù)目臻g內(nèi)移動(dòng),直到光圈再次捕獲環(huán)境。你可以在以下的視頻中看到這類(lèi)的加工痕跡與視野。
?
- Screen Space Reflections | 屏幕空間反射
只有那種看起來(lái)像層壓材質(zhì)的才會(huì)使用這種模型,而這些僅限于神廟之中。在光澤貼圖中的一個(gè)數(shù)值告訴引擎僅對(duì)這些材質(zhì)使用屏幕空間反射。它們會(huì)反射屏幕上的任何內(nèi)容,能夠在任何材質(zhì)的入射余角看到。然而,這些材質(zhì)上同樣也有使用光圈映射來(lái)進(jìn)行環(huán)境反射,這也是讓我感到迷惑的源頭之一。這些材質(zhì)反射的不協(xié)調(diào)表現(xiàn)使得我對(duì)神廟外的其他材質(zhì)也做出了假想。值得慶幸的是,我們把這一點(diǎn)理清了。
觀察建議:看看林克的反射與藍(lán)燈的反射的對(duì)比。林克必須得在屏幕上才能顯示出其反射,而藍(lán)燈不需要在屏幕上也能顯示出反射。
?
(更新)局部反射之謎解開(kāi)了!
?
那么,神廟材質(zhì)具有一層額外的光澤反射層,但他們?cè)谕獠糠瓷渖弦彩褂昧送瑯拥姆瓷淠P汀9植坏眠@么讓人迷惑!
使用光澤材質(zhì),可以在屏幕空間(屏幕空間反射)內(nèi)捕獲所有內(nèi)容的反射。而使用非光澤材質(zhì)(幾乎所有的外部材質(zhì)),使用與虛幻引擎4中所用到的場(chǎng)景捕獲2D反射技術(shù)幾乎完全相同的技術(shù)來(lái)捕獲環(huán)境反射。基本上,虛擬相機(jī)(具有自己的視體與視野)位于林克的頭部正上方,始終面對(duì)主相機(jī)的地平線(xiàn),無(wú)論林克的定向如何(這使得有限的屏幕外反射得以實(shí)現(xiàn))。然后將捕獲的圖像饋送到產(chǎn)生反射的材質(zhì)中,就好像向電視發(fā)出現(xiàn)場(chǎng)直播信號(hào)。這意味著圖像的饋送是以游戲所運(yùn)行的任何幀率(30幀)實(shí)時(shí)投射的。這樣使得材質(zhì)的不同元素得以無(wú)需等待新的捕獲就能更新。但是,實(shí)際捕獲畫(huà)面本身會(huì)以低得多的幀率(4到5幀)而更新。只要場(chǎng)景捕獲相機(jī)從其絕對(duì)位置移動(dòng),你就能看到這一點(diǎn)。在更新捕獲反射之前,當(dāng)前捕獲畫(huà)面于材質(zhì)內(nèi)(例如,水)在相機(jī)移動(dòng)的任何方向?qū)崟r(shí)移動(dòng)(30幀)。然而,一旦材質(zhì)接收到更新的捕獲,就會(huì)更正反射。這種更正的延遲是我們得以真實(shí)地了解捕獲更新即沿著材質(zhì)的痕跡(4到5幀)。
?
你可以在這里看到,過(guò)時(shí)的反射仍然可以平滑地跟蹤林克的行動(dòng)。沒(méi)有任何卡頓。然后當(dāng)新的捕獲更新時(shí),反射就得以更正了。這與反射貼圖的運(yùn)作原理不同,反射貼圖僅在貼圖本身更新時(shí)才會(huì)更新反射。在這,捕獲的反射顯然已經(jīng)過(guò)時(shí)了,但它仍然以30幀的速度改變自身的位置。
你可以在以下動(dòng)圖中體會(huì)到捕獲相機(jī)的FOV:
?
現(xiàn)在為什么所有非自發(fā)光材質(zhì)都只有菲涅爾反射就講得通了。使用這樣的反射技術(shù),這些是它唯一可以正常運(yùn)作的角度了!
我碰巧找到了這個(gè)拱門(mén),并意識(shí)到了這是測(cè)量捕獲相機(jī)視野的完美設(shè)置:
?
?
結(jié)合上一些基本的三角學(xué)來(lái)看
?
我估算其水平視野為大約115°。在林克還沒(méi)有穿過(guò)拱門(mén)前,拱門(mén)的反射就已經(jīng)離屏了,因此我們得知它肯定不是180°的視野了,因?yàn)槿绻堑脑?huà),拱門(mén)的反射就不會(huì)像這樣出現(xiàn)視覺(jué)錯(cuò)誤了。
你還能夠看到,當(dāng)相機(jī)距離拱門(mén)數(shù)英尺并且垂直于拱門(mén)時(shí),反射是傾斜的并且與視野成比例,這使得我們可以觀察到它的寬度。它會(huì)測(cè)量場(chǎng)景捕獲相機(jī)的相對(duì)水平視野。
不過(guò)我想重申一下,這僅僅是粗略的估算,所以我可能會(huì)偏上個(gè)10°左右,但在有的角度下使用這個(gè)視野是不可能的,因此通過(guò)排除法,我們至少能有一個(gè)估算值。
?
- Physically-based Rendering | 基于物理的渲染
在有人問(wèn)起來(lái)前,不,這并不意味著"物理上看起來(lái)正確的材質(zhì)"。這只不過(guò)是應(yīng)用于3D圖形渲染管道的一種方法,所有的材質(zhì)(紋理表面)在與光交互時(shí)獨(dú)特的改變它們的行為方式。現(xiàn)實(shí)世界中就是這樣的,這也就是為什么它被稱(chēng)作基于物理的渲染(基于現(xiàn)實(shí)世界光物理的概念)。不同的材質(zhì)導(dǎo)致光的行為不同,也就是為什么我們能夠在視覺(jué)上區(qū)分不同的表面。
傳統(tǒng)上,渲染管道依賴(lài)于美術(shù)師對(duì)光與不同的真實(shí)世界材質(zhì)的交互方式的理解,并基于那份理解定義紋理貼圖的效果。作為結(jié)果,不同的紋理表面之間存在著很多不一致性,以及它們與現(xiàn)實(shí)世界中的對(duì)應(yīng)物相比之下(這一點(diǎn)是可以理解的,因?yàn)槲覀儾荒苤竿佬g(shù)師對(duì)現(xiàn)實(shí)世界中的所有物質(zhì)都有著百科全書(shū)般的知識(shí))。對(duì)于PBR,光物理的基本原理是管道本身的一部分,并且所有的紋理表面都被歸類(lèi)為具有獨(dú)特性質(zhì)的材質(zhì),這些性質(zhì)將導(dǎo)致光根據(jù)這些獨(dú)特性質(zhì)運(yùn)轉(zhuǎn)。這樣使得不同表面得以放置于不同的光照條件以及動(dòng)態(tài)相機(jī)角度之下,并動(dòng)態(tài)的調(diào)整光與這些表面的交互方式。美術(shù)師不必像傳統(tǒng)工作流程那樣預(yù)定義這種交互方式。一切都是自動(dòng)的。由于PBR的效率,開(kāi)發(fā)人員更想要制作其中所有材質(zhì)都有著影響光的獨(dú)特性質(zhì)的游戲。
在《曠野之息》中,其PBR有一點(diǎn)藝術(shù)天賦,因此你可能甚至不會(huì)注意到其引擎有依賴(lài)于這樣的管道,因?yàn)榧y理并不一定需要看起來(lái)很逼真。然而,材質(zhì)上所用到的BDRFs(雙向反射分布函數(shù))使得引擎有用PBR這一點(diǎn)比較明確。對(duì)于每一個(gè)動(dòng)態(tài)光源,它的鏡面高光(光源本身顯示為反射表面的部分)和這些高光的反射率/折射率是根據(jù)入射角(入射光相對(duì)于表面法線(xiàn)的角度)和光與之相互作用的任何材質(zhì)的折射率(當(dāng)光線(xiàn)接觸其表面時(shí),材質(zhì)"彎曲"了多少的光)動(dòng)態(tài)生成的。如果游戲使用的是傳統(tǒng)管道,分配在木頭與金屬上的鏡面高光之間就不會(huì)有太大的差異。但在這個(gè)游戲中,手游拍賣(mài)平臺(tái)鏡面高光的產(chǎn)生完全取決于光與之相互作用的材質(zhì)。
另一個(gè)表明《曠野之息》使用PBR的關(guān)鍵因素是所有材質(zhì)上的Fresnel(s不發(fā)音) | 菲涅爾反射。首先,大部分使用傳統(tǒng)管道的游戲甚至都不會(huì)用上菲涅爾反射,因?yàn)檫@樣還不如直接用PBR了。正如我之前在討論局部反射時(shí)所解釋的那樣,菲涅爾反射在入射余角處變得可見(jiàn)(入射光幾乎與觀察者/相機(jī)的視角相互作用的表面平行的角度)。根據(jù)菲涅爾反射系數(shù),所有材質(zhì)在入射余角下都達(dá)到了100%的反射率,但反射率的有效性將取決于材質(zhì)的粗糙度。因此,程序員可以區(qū)分"反射率"與"折射率"。一些材質(zhì)反射所有方向的光(漫反射材質(zhì))。即使在100%的反射率下,100%的光也可能從整個(gè)表面區(qū)域反射出來(lái),但并非所有光都在同一方向上反射,因此光線(xiàn)均勻分布,而你看不到任何鏡面反射(表面周?chē)溺R像)。其他材質(zhì)只會(huì)反射入射光相反方向的入射光(鏡面材質(zhì)),因此你只能在適當(dāng)?shù)慕嵌瓤吹椒瓷?接近90%的光都被反射了。漫反射和鏡面反射材質(zhì)的反射率即便是在入射余角下,其反射率(材質(zhì)反射入射光能力的有效性)也不總是100%,這就是為什么在入射余角下所有材質(zhì)都看不到完美的鏡面反射,哪怕是在現(xiàn)實(shí)世界中也是如此。菲涅爾反射的清晰度將隨著產(chǎn)生反射的材質(zhì)而變化。
觀察建議:注意桶子木頭上的綠色光源是如何在所有角度看起來(lái)都是相同的,而這一相同的綠色光源似乎還改變了金屬桶箍(桶上的金屬圓圈)的反射。
- Emissive materials and area lights | 自發(fā)光材質(zhì)與區(qū)域光源
這一個(gè)比較簡(jiǎn)單。發(fā)光物件的材質(zhì)提供獨(dú)特的光源,以與材質(zhì)本身相同的形狀照明環(huán)境。這些并不是在所有方向上傳播的點(diǎn)光源,甚至有時(shí)會(huì)是在一個(gè)方向上照明的簡(jiǎn)單定向光源。有一點(diǎn)很重要值得一提,只有全局(太陽(yáng)/月亮/閃電)光源才能投射陰影。然而,雙向反射分布函數(shù)仍然應(yīng)用于游戲中所有的光源。
觀察建議:注意火劍所投射的光的形狀。這一形狀與劍本身的形狀相匹配,但光的強(qiáng)度將取決于劍與它所照明的表面之間的距離。
?
- Screen Space Ambient Occlusion | 屏幕空間環(huán)境光遮蔽
在現(xiàn)實(shí)世界中,當(dāng)光在環(huán)境中反射后會(huì)有一定量的"環(huán)境光"為環(huán)境著色,使其變得完全漫射。如果說(shuō)陰影是遮擋直射陽(yáng)光物體的產(chǎn)物的話(huà),那么環(huán)境光遮蔽可以被認(rèn)為是環(huán)境中縫隙阻擋環(huán)境光的產(chǎn)物。
《曠野之息》中所使用的方案稱(chēng)為SSAO(屏幕空間環(huán)境光遮蔽),因?yàn)樗?jì)算了屏幕空間中的環(huán)境光遮蔽并且取決于視點(diǎn)依賴(lài)。環(huán)境只會(huì)在相對(duì)于相機(jī)垂直時(shí)它才會(huì)接收環(huán)境光遮蔽。
觀察建議:當(dāng)從正面看時(shí),在墻壁中的縫隙中尋找黑暗,陰影的噪聲模式效果。同樣的噪聲模式也從這個(gè)角度勾勒出了林克的輪廓。
?
- Dynamic Wind Simulation system | 動(dòng)態(tài)風(fēng)力模擬系統(tǒng)
這一個(gè)讓我感到很驚訝,因?yàn)槲彝耆珱](méi)想到它會(huì)如此的強(qiáng)勁。基本上來(lái)說(shuō),物理系統(tǒng)與風(fēng)力模擬系統(tǒng)是相關(guān)聯(lián)的。它是完全動(dòng)態(tài)的,并根據(jù)各自的重量值影響不同的物體。受影響效果最突出的對(duì)象是草地與程序生成的云。
觀察建議:如果你仔細(xì)觀察的話(huà),可以在這里看到草和云的方向性流動(dòng)是如何與風(fēng)的變化方向相匹配的。
?
- Real-time cloud formation | 實(shí)時(shí)云體變形
這個(gè)游戲沒(méi)有使用任何意義上的傳統(tǒng)天空盒。云體是基于引擎設(shè)置的參數(shù)程序性生成的。它們會(huì)投射出實(shí)時(shí)的陰影。它們根據(jù)太陽(yáng)在天空中的位置接收到了光照信息。據(jù)我所知,云被視為游戲中的實(shí)際材質(zhì)。它們并不是體積云,所以你不會(huì)看到任何云隙光之類(lèi)的東西,但同時(shí)它們也不是"天空盒"的云。它們的形成也受到風(fēng)力系統(tǒng)的影響。
觀察建議:注意天空中的云體粒子是如何隨機(jī)地聚集在一起的。
?
- Rayleigh scattering/Mie Scattering | 瑞利散射/米氏散射
在現(xiàn)實(shí)世界中,當(dāng)光線(xiàn)到達(dá)地球的大氣層時(shí),會(huì)被空氣分子散射,從而形成了地球的藍(lán)天,因?yàn)檩^短波長(zhǎng)的藍(lán)光比其他顏色的光更容易散射。然而,當(dāng)太陽(yáng)接近地平線(xiàn)時(shí),它就必須得穿過(guò)更多的大氣層,從而導(dǎo)致大部分藍(lán)光在太陽(yáng)光到達(dá)觀察者眼鏡時(shí)散射,留下波長(zhǎng)更長(zhǎng)的橙色和紅色光到達(dá)肉眼。《曠野之息》數(shù)學(xué)上地近似了這個(gè)算法(我其實(shí)是在今年早些時(shí)候通過(guò)文本轉(zhuǎn)儲(chǔ)代碼中發(fā)現(xiàn)的!)顯然這一算法也解釋了米氏散射的由來(lái),它使得霧得以在天空中出現(xiàn)。
老實(shí)說(shuō),要不是我查看了該文本轉(zhuǎn)儲(chǔ)中的代碼,我是絕對(duì)不可能想到游戲中有模擬這一現(xiàn)象的。想要偽造出這種效果很容易。然而,在觀察了水中天空的倒影之后,這一切都說(shuō)得通了。這種散射光實(shí)時(shí)地反射入整個(gè)環(huán)境中。若是單純的天空盒會(huì)使得這一點(diǎn)不可能實(shí)現(xiàn)。
觀察建議:注意天空中橙色與紅色的不同色調(diào)是如何以相同的顏色反映在環(huán)境上的。盡管未在動(dòng)圖中展示這一點(diǎn),但是天空中的散射光也以其他的顏色照明了環(huán)境以及水面,這取決于光是如何散射的。
?
觀察建議:注意隨著太陽(yáng)落山,雪的顏色也隨之發(fā)生變化。
?
觀察建議:在此動(dòng)圖開(kāi)頭,水面至少有5個(gè)不同的反射。神廟(藍(lán)色),山丘(綠色),旗幟(黑色輪廓),天空(橙色)和太陽(yáng)(粉色)。山丘,旗幟,和神廟的反射都通過(guò)場(chǎng)景捕獲反射而實(shí)現(xiàn),太陽(yáng)則通過(guò)鏡面光照(作為鏡面高光)而實(shí)現(xiàn),天空也通過(guò)鏡面光照而實(shí)現(xiàn)反射,但并不是鏡面高光。隨著暴雨的來(lái)臨,反射的變化是完全動(dòng)態(tài)的。來(lái)自烏云的天空遮蔽會(huì)實(shí)時(shí)改變天空中瑞利散射的光照。最終,橙色天光不能夠再達(dá)到水的表面而逐漸消失,但太陽(yáng)仍然存在,因?yàn)樗鼪](méi)有被完全遮擋住。然而,由于天空中如此多的米氏散射,太陽(yáng)的顏色從粉色變成了白色!即便如此,最終云體變得對(duì)太陽(yáng)來(lái)說(shuō)太多了,完全遮擋了它,僅留下了來(lái)自神廟的光與山丘的部分反射。
?
- Full Volumetric Lighting | 完整體積光照
除了天空中的云,環(huán)境中的每個(gè)部分及其中的每個(gè)物體都有可能在適當(dāng)?shù)墓庹諚l件下實(shí)時(shí)創(chuàng)建光束。這個(gè)游戲使用的是屏幕空間環(huán)境光遮蔽來(lái)輔助這一效果,但體積光照并非視點(diǎn)依賴(lài)。你可以在本文中的陰影體部分找到更多有關(guān)體積光照運(yùn)作原理的信息。
觀察建議:注意光束是如何在大型建筑結(jié)構(gòu)投射的陰影中產(chǎn)生的。
?
- Bokeh DOF and approx. of Circle of Confusion | Bokeh景深與模糊圈的近似值
我認(rèn)為引擎所用到的另一個(gè)令人驚訝的功能是延遲光照/著色。那么我要稍微簡(jiǎn)化一點(diǎn),因?yàn)檫@可以真正地在技術(shù)上解釋首先為什么現(xiàn)實(shí)世界中會(huì)出現(xiàn)散景效果。可以說(shuō)當(dāng)光進(jìn)入肉眼/相機(jī)的光圈(開(kāi)口)時(shí),入射光線(xiàn)開(kāi)始會(huì)聚到焦平面的單個(gè)點(diǎn)上。隨著光越來(lái)越集中在這個(gè)平面上,它的外觀變得越來(lái)越銳利,越來(lái)越小。隨著光遠(yuǎn)離該平面并變得更加散焦,它的外觀變得越來(lái)越大,越來(lái)越模糊。
家喻戶(hù)曉的散景效應(yīng)是當(dāng)進(jìn)入相機(jī)鏡頭的光點(diǎn)呈現(xiàn)出在它們通過(guò)光圈時(shí)的形狀(例如,六邊形)。模糊圈是當(dāng)人類(lèi)無(wú)法區(qū)分完全聚焦的光點(diǎn)與略微失焦的光點(diǎn)時(shí)的聚焦區(qū)域。景深通常由模糊圈來(lái)決定。有趣的是,當(dāng)使用希卡望遠(yuǎn)鏡與相機(jī)符文時(shí),《曠野之息》會(huì)模擬出這兩種概念。我的猜測(cè)是它是基于紋素(紋理要素)數(shù)據(jù)在屏幕空間中計(jì)算的,然后作為后期特效應(yīng)用。
觀察建議:注意相機(jī)的十字線(xiàn)與金屬盒上閃耀的藍(lán)色燈光。當(dāng)相機(jī)對(duì)焦于遠(yuǎn)離光源的遠(yuǎn)景時(shí),光源就會(huì)變得模糊,同時(shí)變得更大。當(dāng)相機(jī)直接對(duì)焦于光源時(shí),則會(huì)出現(xiàn)相反的情況。藍(lán)色光源所形成的圓形形狀稱(chēng)為散景效果。
?
- Sky Occlusion and Dynamic Shadow Volumes | 天空遮蔽與動(dòng)態(tài)陰影體
除了游戲中的物理系統(tǒng)以外,這些著色特性毫無(wú)疑問(wèn)是《曠野之息》中計(jì)算方面上來(lái)講性能損耗最高的要素。
即便云本身沒(méi)有任何體積,但它們?nèi)阅軐?軟)陰影投射到環(huán)境當(dāng)中。然而,太陽(yáng)與來(lái)自天空的散射光動(dòng)態(tài)地照明整個(gè)環(huán)境,而環(huán)境與其中所有的物體根據(jù)該照明投射出自己的陰影。如果環(huán)境中的照明即便是在天空完全被陰云覆蓋的情況下仍然保持不變的話(huà)就會(huì)顯得很不真實(shí)。由于遮蔽區(qū)域的直接光照比較少,環(huán)境光(漫反射,非定向光)將會(huì)在這些區(qū)域的照明中發(fā)揮更大的作用,并且這些區(qū)域中的所有陰影都將變得更為柔和并開(kāi)始匹配它們周邊環(huán)境的顏色。
該引擎還是用了陰影體而非簡(jiǎn)單的陰影貼圖,并且游戲中的每一個(gè)陰影投射器都是這樣實(shí)現(xiàn)的。陰影體在指定的3D空間內(nèi)投射,而不僅僅是環(huán)境中的表面與物體。除了在執(zhí)行陰影體時(shí)看起來(lái)更為真實(shí)的天空遮蔽,同時(shí)當(dāng)它與能夠接收陰影的大氣層霧相結(jié)合時(shí),在3D空間內(nèi)動(dòng)態(tài)生成陰影體還可以提供完整實(shí)時(shí)體積光照所帶來(lái)的優(yōu)勢(shì),而在《曠野之息》中正是如此。
觀察小技巧:觀察旗幟的硬陰影是如何變得更加柔和,并隨著突如其來(lái)的暴風(fēng)雨開(kāi)始從環(huán)境光中接收更多的顏色。
?
觀察建議:注意旗幟的運(yùn)動(dòng)是如何與產(chǎn)生的光束相關(guān)聯(lián)的。光束之間的暗區(qū)是因旗幟的陰影體而存在的。旗幟的動(dòng)態(tài)扭曲告訴了我們這些陰影體是實(shí)時(shí)生成的。
?
- Aperture Based Lens Flares | 基于光圈的鏡頭光暈
99%玩這個(gè)游戲的人都忽視了這一特性,所以老實(shí)說(shuō)我都不確定到底值不值得實(shí)施這玩意。
基本上,當(dāng)來(lái)自明亮光源的光線(xiàn)以某種傾斜的角度進(jìn)入相機(jī)鏡頭時(shí),由于在相機(jī)要素內(nèi)部反射的光線(xiàn),它們會(huì)產(chǎn)生稱(chēng)為鏡頭光暈的光學(xué)加工痕跡。大多數(shù)游戲只是將光暈作為后期效果來(lái)模擬這種效果,當(dāng)相機(jī)略偏于相機(jī)視體時(shí)就會(huì)出現(xiàn)這種效果。光在相機(jī)本身內(nèi)部反射這一概念甚至沒(méi)有被作為因素而考慮。
在《曠野之息》中,由于引擎已經(jīng)模擬了景深的相機(jī)光圈,它可以追蹤光圈與太陽(yáng)的相對(duì)位置,并計(jì)算出應(yīng)該生成多少鏡頭光暈,即便太陽(yáng)并不在屏幕上。但這還并不是一切!具有變焦功能的相機(jī)更容易出現(xiàn)鏡頭光暈,并且光暈會(huì)根據(jù)光圈的形狀/大小和變焦級(jí)別而改變形狀與大小。令人驚訝的是,《曠野之息》也近似出了這些效果!
觀察建議:你可以看到,即便太陽(yáng)在屏幕外,鏡頭光暈(圓形光線(xiàn)加工痕跡)仍然存在。更重要的是,鏡頭光暈的形狀,大小與清晰度隨著相機(jī)變焦級(jí)別而變化。
?
- Sub-surface Scattering | 次表面散射
在現(xiàn)實(shí)世界中,有些表面是半透明的(不要與透明混淆),這意味著光能穿過(guò)其表面并散射于其內(nèi)部。現(xiàn)實(shí)世界中半透明表面的部分例子為人體皮膚,葡萄,蠟,以及牛奶。在3D圖形中對(duì)光的這種獨(dú)特行為建模稱(chēng)作次表面散射或SSS。與大多數(shù)實(shí)時(shí)3D渲染方案相同,程序員已經(jīng)提出了數(shù)種近似這種效果的方法,而無(wú)需在分子水平上模擬光的反彈。《曠野之息》中所用的方法相對(duì)簡(jiǎn)單但很有效。
任何應(yīng)具有一定程度半透明度的表面都將會(huì)有多層材質(zhì)以生成次表面散射。第一層是內(nèi)部材質(zhì)。這種材質(zhì)通常用照明信息來(lái)烘培,使其具有半透明的樣子。光穿過(guò)材質(zhì)但實(shí)際上并沒(méi)有實(shí)時(shí)照明材質(zhì)本身。在這種材質(zhì)之上的材質(zhì)就是表面材質(zhì)。這種材質(zhì)在兩者中持主導(dǎo)地位,在大多數(shù)光照條件下你所看到的都是這種材質(zhì)。
這些材質(zhì)之間的關(guān)系以這樣的方式運(yùn)作,即任一材質(zhì)的主要外觀總是由入射光與透射光之間的比率決定。如果表面材質(zhì)反射的光比內(nèi)部材質(zhì)透射的光更多,那么表面材質(zhì)的不透明度將與其接收的光成正比例增長(zhǎng)。如果內(nèi)部材質(zhì)透射的光比表面材質(zhì)反射的光多,那么表面材質(zhì)的不透明度將與其未接收的光成正比例降低。根據(jù)入射率/透射率來(lái)平衡表面材質(zhì)的不透明度是非常巧妙且效率高的一種方法,可以使材質(zhì)具有次表面散射效果。
觀察建議:注意能夠在外部表面看到馬廄內(nèi)部的光的漫反射照明。林克在屋頂上的陰影同時(shí)也被了來(lái)自?xún)?nèi)部的光照照明,但當(dāng)在地面時(shí)不會(huì)這樣。
?
更新:對(duì)次表面散射的進(jìn)一步調(diào)查。當(dāng)更多的太陽(yáng)光照明這些植被時(shí),其下側(cè)的亮度/顏色會(huì)發(fā)生變化。
?
觀察建議:注意表面材質(zhì)是如何因?yàn)榻邮樟烁嗟墓饩€(xiàn)而變得更不透明,使其內(nèi)部材質(zhì)變得模糊。
?
觀察建議:注意表面材質(zhì)是如何因?yàn)榻邮樟溯^少的光線(xiàn)而變得更加清晰,使其內(nèi)部材質(zhì)變得清楚。
?
- Dynamically Localized Lightning Illumination | 動(dòng)態(tài)局部閃電照明
許多游戲通過(guò)將閃電作為全局光源而實(shí)現(xiàn)環(huán)境照明,在整個(gè)環(huán)境中閃爍,所有陰影投射器都以預(yù)定的大小和方向投射陰影。
在《曠野之息》中,雷擊基本上就是超大的一坨相機(jī)閃光燈,每一個(gè)都有著自己的半徑與強(qiáng)度,并且能夠在地圖上的任何一處劈下,無(wú)論玩家位于何處。《曠野之息》其閃電的有趣之處在于陰影動(dòng)態(tài)地對(duì)應(yīng)于陰影投射器最近的雷擊的強(qiáng)度與位置。這一系統(tǒng)可能是我在所有游戲中見(jiàn)過(guò)的最酷的閃電系統(tǒng)。
觀察建議:注意每一次雷擊時(shí)其陰影大小,方向與對(duì)比度的變化。
?
- Per-Pixel Sky Irradiance | 逐像素天空輻照度
如果說(shuō)輻射率是來(lái)自太陽(yáng)的輻射量的話(huà),那么輻照度就可以說(shuō)是給定表面實(shí)際接收的輻射量。對(duì)于散射天光來(lái)說(shuō),這是一個(gè)相當(dāng)重要的變量,因?yàn)槲覀冎阅軌蛟谝雇砜聪蛱盏闹饕蚓褪且驗(yàn)闆](méi)有它!《曠野之息》使用一種跟蹤太陽(yáng)相對(duì)于天頂位置的算法來(lái)計(jì)算輻照度,并且在日落期間,它開(kāi)始逐像素地移除天光,直至沒(méi)有剩下的輻照度為止。當(dāng)天空中沒(méi)有了云層與米氏散射后,星星將開(kāi)始出現(xiàn)在天空中,即便天還沒(méi)有完全黑下來(lái)。夜晚與白天之間的顏色漸變過(guò)渡實(shí)在是令人印象深刻。
觀察建議:本身你是可以在太陽(yáng)落山時(shí)星星出現(xiàn)的,但由于Twitter+動(dòng)態(tài)二重壓縮,這一點(diǎn)也就看不到了。
?
- Fog inscatter | 霧光散射
在現(xiàn)實(shí)世界中,霧像物理對(duì)象那樣接收光與影。如果霧是體積的話(huà),那么計(jì)算機(jī)圖形的計(jì)算效率就會(huì)很低。《曠野之息》通過(guò)創(chuàng)建一份霧噪聲模式(類(lèi)似于它們的環(huán)境光遮蔽噪聲模式,但不限于屏幕空間)并應(yīng)用來(lái)自太陽(yáng)和天光的輻射值來(lái)生成光散射來(lái)解決這個(gè)問(wèn)題。當(dāng)你將其與陰影體結(jié)合使用時(shí),不僅可以獲得體積光照,即便在沒(méi)有體積的情況下它看起來(lái)也會(huì)像是有體積的霧。
觀察建議:注意山上的霧是如何呈現(xiàn)出環(huán)境中可用光的顏色的,同時(shí)看起來(lái)還很有體積感。
?
?
- Particle Lights | 粒子光源
游戲中幾乎每一個(gè)粒子都是自發(fā)光的。其中許多同時(shí)也照明了環(huán)境。許多粒子不是將粒子視作物體而渲染,而是可以在3D空間的所有方向上發(fā)光的簡(jiǎn)單的點(diǎn)光源。
觀察建議:注意無(wú)論相機(jī)如何移動(dòng),發(fā)光的余燼是如何在3D空間內(nèi)獨(dú)立移動(dòng)的。
?
觀察建議:雪粒子在《曠野之息》中是視為粒子光源渲染的。一種產(chǎn)生了雪粒子能夠反射太陽(yáng)光的錯(cuò)覺(jué)的方法。不過(guò)這也可能僅僅是不同的美術(shù)選擇就是了。
?
觀察建議:注意螢火蟲(chóng)是如何照明它們周邊環(huán)境的。
?
- Puddle formation and evaporation | 水坑的形成與蒸發(fā)
可能是游戲中最奇妙但也最聰明的渲染解決方案了。在游戲世界的整個(gè)地形之下,存在一層水面材質(zhì)的平面,當(dāng)下雨時(shí),水面材質(zhì)將升高與降低以用水填充水池,并在太陽(yáng)回來(lái)時(shí)蒸發(fā)掉這些水。根據(jù)水面與地面的相對(duì)距離,會(huì)用上一個(gè)水沫材質(zhì)層。這一過(guò)程非常簡(jiǎn)單,同時(shí)也是游戲中又一個(gè)令人印象深刻的動(dòng)態(tài)效果。
觀察建議:仔細(xì)觀察在下雨時(shí)水池是如何"填充"滿(mǎn)水的。
?
觀察建議:仔細(xì)觀察雨停且太陽(yáng)出來(lái)時(shí)水面是如何"蒸發(fā)”的。
?
我其實(shí)還回去翻閱了一下這游戲的文本轉(zhuǎn)儲(chǔ),幾乎證實(shí)了我所提到的所有內(nèi)容。看來(lái)我應(yīng)該先去翻翻文本轉(zhuǎn)儲(chǔ)而不是在游玩過(guò)程中調(diào)查引擎,這樣就輕松多了!
于是,本次分析就已經(jīng)結(jié)束了。與往常一樣,如果你對(duì)帖子中所提供的信息有任何疑問(wèn)的話(huà),歡迎隨時(shí)告訴我。
?
總結(jié)
以上是生活随笔為你收集整理的《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 撕掉“丑”的标签,体素是如何让游戏更有趣
- 下一篇: J.R.R.托尔金笔下的中土世界与《斗破