導(dǎo)語(yǔ):在今年的游戲開(kāi)發(fā)者大會(huì)(GDC 2025)上,騰訊游戲帶來(lái)20場(chǎng)議題分享,圍繞AI、渲染、跨端游戲開(kāi)發(fā)等游戲技術(shù)應(yīng)用及游戲研發(fā)經(jīng)驗(yàn)與全球游戲開(kāi)發(fā)者探討交流,引發(fā)同業(yè)關(guān)注。此外,騰訊海外工作室拳頭、Supercell、Digital Extremes等也帶來(lái)了超40場(chǎng)分享。本文為“《三角洲行動(dòng)》:高性能高品質(zhì)的端手地形和生態(tài)技術(shù)”分享的圖文版干貨內(nèi)容。

分享嘉賓:

王理川 騰訊游戲天美J3工作室技術(shù)美術(shù)組負(fù)責(zé)人

大家好,很榮幸能站在這里代表騰訊游戲參加2025年的GDC大會(huì)。歡迎大家來(lái)到《三角洲行動(dòng):高性能高品質(zhì)的端手地形和生態(tài)技術(shù)》的分享。首先,請(qǐng)?jiān)试S我簡(jiǎn)單介紹一下自己并提供一些背景信息。

我叫王理川,自2005年進(jìn)入游戲行業(yè),至今已有約20年時(shí)間,這對(duì)我來(lái)說(shuō)都難以置信。我曾在育碧上海和蒙特利爾工作了大約16年,專(zhuān)注于AAA級(jí)射擊游戲,主要是湯姆克蘭西系列,包括幽靈行動(dòng)和分裂細(xì)胞,相信你們中的一些人可能知道這些IP,還有孤島驚魂系列,從孤島驚魂4一直到孤島驚魂6。

然后在2020年,我加入了騰訊游戲的琳瑯天上團(tuán)隊(duì),作為工作室首席技術(shù)美術(shù)師支持幾款游戲,比如《穿越火線(xiàn)》手游和《使命召喚》手游,這兩款都非常成功。最近,我花了幾年時(shí)間在《三角洲行動(dòng)》項(xiàng)目上,主要專(zhuān)注于渲染、程序化、管線(xiàn)、工具等方面。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

首先,我想為今天的分享設(shè)定一些期望。

這不是一個(gè)純粹的程序講座,而是程序與視覺(jué)藝術(shù)/技術(shù)美術(shù)管線(xiàn)工具的結(jié)合。那么,讓我們來(lái)看一下今天的《三角洲行動(dòng)》的目標(biāo)。

《三角洲行動(dòng)》是一款超寫(xiě)實(shí)主義的FPS游戲,整體渲染解決方案和藝術(shù)呈現(xiàn)基于PBR,可以將其視為一個(gè)純粹的基于物理的渲染項(xiàng)目。這也是創(chuàng)造自然開(kāi)放世界的關(guān)鍵。

我們的技術(shù)框架必須夠高效地為兩個(gè)平臺(tái)提供游戲,盡管時(shí)間和人力都非常有限。當(dāng)然,最后游戲需要高性能,這意味著它需要在PC和各種移動(dòng)設(shè)備上流暢運(yùn)行。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

好的,讓我們來(lái)看看今天的議程。首先,我們會(huì)簡(jiǎn)要介紹一下《三角洲行動(dòng)》,以防你們中有人不熟悉這款游戲。然后,我會(huì)講解地形和生物群落中的一些核心著色器技術(shù),以便你們?cè)趦蓚€(gè)平臺(tái)上看到今天的內(nèi)容。接下來(lái),我會(huì)談?wù)勎覀內(nèi)绾问褂贸绦蚧ぞ邅?lái)幫助生物群落的生成和管理。

從技術(shù)角度來(lái)看,我們將介紹適用于PC和移動(dòng)設(shè)備的地形紋理(terrain texturing)和地形幾何(terrain geometry)解決方案,這些解決方案具有非常低的消耗和最小的偽影。

接下來(lái),我們將深入探討各種性能優(yōu)化技術(shù)。最后,我們將總結(jié)一些最后的想法和我們已經(jīng)在進(jìn)行的未來(lái)工作。

這里有一個(gè)幾個(gè)月前剛剛發(fā)布的視頻片段,應(yīng)該能為你們提供一些我們正在討論的內(nèi)容的背景,那么讓我們一起來(lái)看看。

好的,現(xiàn)在一起看看我們面臨的技術(shù)限制。《三角洲行動(dòng)》在多個(gè)平臺(tái)上發(fā)布,包括PC和各種移動(dòng)設(shè)備,從低端到高端。我們旨在PC上達(dá)到高達(dá)4K 144幀,同時(shí)在旗艦移動(dòng)設(shè)備上仍能高達(dá)120幀。我們?cè)陂_(kāi)放世界中有一個(gè)完整的晝夜循環(huán),包括室內(nèi)外環(huán)境。因此,世界構(gòu)建中的生物群落、地形等都需要與一天中的所有時(shí)間兼容。我們有一個(gè)100平方公里的主要世界,還有一些相對(duì)較小的地圖。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

說(shuō)到地圖大小,讓我簡(jiǎn)要介紹一下游戲的規(guī)模。我們有三種游戲模式:

撤離模式,就像我之前說(shuō)的,這是主世界,位于一個(gè)10公里×10公里的開(kāi)放世界。在這個(gè)巨大的地圖上隨機(jī)事件將玩家持續(xù)保持熱度。

大規(guī)模PVP模式,包含多個(gè)4×4和2×2的地圖,每張地圖的具體尺寸由關(guān)卡設(shè)計(jì)師根據(jù)游戲目的進(jìn)行定制。這種模式允許最多64名玩家同時(shí)出現(xiàn)在戰(zhàn)場(chǎng)上,同時(shí)保持非常高的幀率。并且具有真實(shí)的地形,包括軍事車(chē)輛、坦克和直升機(jī)的宏大戰(zhàn)爭(zhēng),我們還在這游戲模式中開(kāi)發(fā)了廣泛的戰(zhàn)爭(zhēng)破壞系統(tǒng)和大規(guī)模破壞資產(chǎn)。

最后是戰(zhàn)役模式,這是一種非常典型的線(xiàn)性任務(wù)游戲模式,重啟經(jīng)典的黑鷹墜落。這個(gè)模式也發(fā)生在一個(gè)巨大的地圖上。這個(gè)模式的地形、環(huán)境和游戲體驗(yàn)將帶你們回到25年前的經(jīng)典三角洲部隊(duì)IP。

我們先來(lái)看生物群落,我將重點(diǎn)說(shuō)說(shuō)跨平臺(tái)的框架。

為了讓整個(gè)三角洲世界更加真實(shí)可信,游戲中有大量不同的生態(tài)分布,并且除了主世界是在摩洛哥,其他一些玩法模式將會(huì)發(fā)生在世界各地,不同的氣候,環(huán)境,以及戰(zhàn)損狀態(tài)。如何在差異巨大的雙平臺(tái)實(shí)現(xiàn)這些內(nèi)容,并且系統(tǒng)化的進(jìn)行特性管理,甚至內(nèi)容復(fù)用,是今天的跨平臺(tái)生態(tài)shading的主題。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

為了增加生態(tài)表現(xiàn)得豐富性,我們不希望通過(guò)完全的隨機(jī)shading來(lái)實(shí)現(xiàn)這件事情,視覺(jué)效果豐富但可信度比較低,如果通過(guò)材質(zhì)變體實(shí)現(xiàn),會(huì)讓DrawCall急劇增加,也不宜與管理和迭代。所以,在開(kāi)發(fā)的早期我們嘗試采樣了一張大型紋理,來(lái)為其提供可控的色彩變化。但是對(duì)于10x10的開(kāi)放世界來(lái)說(shuō),10k分辨率占用內(nèi)存約100Mb,這在移動(dòng)端仍然沒(méi)有辦法落地的,于是乎,我們引入了clipmap。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

簡(jiǎn)而言之,剪切映射是一種動(dòng)態(tài)紋理表示,能夠高效地在有限的物理內(nèi)存中緩存任意大小的紋理,以實(shí)現(xiàn)實(shí)時(shí)渲染速率。大家可以看到,隨著相機(jī)移動(dòng)進(jìn)行滾動(dòng)更新,相機(jī)范圍內(nèi)的紋理使用mip0,隨著距離逐級(jí)遞減,這種方式可以大幅減少內(nèi)存占用,同時(shí)保證了近距離的精度。有著clipmap的加持,大大降低了內(nèi)存的占用,原本100M的占用率一下子降低到了2.5M這個(gè)級(jí)別,使得在手游平臺(tái)的落地變?yōu)榱丝赡堋?/p>

打開(kāi)網(wǎng)易新聞 查看精彩圖片

相比常規(guī)貼圖采樣,clipmap本身的更新會(huì)有更多指令消耗,所以我們決定不僅僅面數(shù)植被變色,而是基于這個(gè)基礎(chǔ)上進(jìn)行深挖,整合更多的信息到這唯一一張clipmap中。

其中包含了植被的狀態(tài),四季變化,水域數(shù)據(jù),地形潮濕等,全部塞到了這張紋理中的各個(gè)通道中,它幾乎涵蓋了當(dāng)前生態(tài)的全部信息。各個(gè)生態(tài)模塊的shader都會(huì)采樣這些信息。

并且整個(gè)框架端游手游統(tǒng)一,接下來(lái)我會(huì)逐一展開(kāi)講解。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

首先說(shuō)一下植被部分,10km的開(kāi)放世界不同區(qū)域、因?yàn)樯L(zhǎng)環(huán)境不同,海拔高度等不同植被的健康狀態(tài)存在著差異。而在不同游戲模式下,關(guān)卡有不同四季的設(shè)定。我們希望一個(gè)植被資產(chǎn)能有不同的四季表現(xiàn),從而最高程度的復(fù)用資產(chǎn)。

那不得不說(shuō)一下健康度的概念,你也同樣可以理解為植被四季變化的概念。我們分別在clipmap的R通道和B通道儲(chǔ)存了樹(shù)和草的健康度信息。之所以樹(shù)木和草分開(kāi),是因?yàn)樵趯?shí)際應(yīng)用中,兩者差異明顯,不能共用信息。

此外我們認(rèn)為戰(zhàn)損也可以算作健康度的一部份,所以我們將戰(zhàn)損狀態(tài)也編碼到這2個(gè)通道中。

比如0.1-0.85存儲(chǔ)著健康信息或者四季信息,將戰(zhàn)損信息壓縮到0.9-1。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

除了clipmap作為全局健康度或者說(shuō)四季變化的輸入信息外,資產(chǎn)個(gè)體則有與之對(duì)應(yīng)的健康變化表現(xiàn)以及戰(zhàn)損的表現(xiàn)。為每個(gè)植被資產(chǎn)基于季節(jié)創(chuàng)建色彩偏移以及燒毀效果,并將其儲(chǔ)存在獨(dú)立的look up table中。通過(guò)clipmap中的值采樣LUT,得到看似隨機(jī)但是完全可以掌控的結(jié)果。并且雙端方案保持一致。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在資產(chǎn)方面,在PC上,我們將一個(gè)蒙版打包到法線(xiàn)圖中作為色調(diào)蒙版,并在上面使用線(xiàn)性插值與BaseColor進(jìn)行混合。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在移動(dòng)設(shè)備上,為了進(jìn)一步優(yōu)化性能,我們放棄了基本顏色,而是完全依賴(lài)于我們所謂的“strands mask”(一種灰度圖),它被打包到法線(xiàn)圖中。因此,輸入數(shù)據(jù)減少了一個(gè)紋理,這大大減少了紋理采樣。在視覺(jué)效果上,我們對(duì)此都非常滿(mǎn)意。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

當(dāng)植物的不健康程度偏移到極限的時(shí)候,就是我們的植物燃燒狀態(tài),用0.9到1來(lái)定義。它和四季變化共享一個(gè)LUT, 這種方式的好處在于可以實(shí)現(xiàn)平滑的燃燒過(guò)度,同時(shí)不需要增加更多的材質(zhì)變體。

當(dāng)然由于算力限制。在手游上,我們所呈現(xiàn)的燒焦僅是一個(gè)顏色變黑,我們?cè)赑C上為其添加了更多的shading細(xì)節(jié)以及復(fù)雜的分布規(guī)則。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在PC平臺(tái)為了營(yíng)造更好的氛圍感和真實(shí)度,會(huì)按照一定的規(guī)則整合彈坑以及燃燒特效等,材質(zhì)上也會(huì)做更多的細(xì)節(jié),比如燒掉的葉子,燃燒的火星,這些內(nèi)容都可以輕易通過(guò)材質(zhì)質(zhì)量分級(jí)進(jìn)行性能降配,從而保持跨平臺(tái)風(fēng)格和效果的一致性。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們將和水相關(guān)的一些信息也都pack在這張clipmap中。

在空間上,河流和陸地生態(tài)是互斥的,所以他們的儲(chǔ)存并不沖突,換個(gè)說(shuō)法大部分植物不會(huì)同時(shí)生長(zhǎng)在水下和陸地上, 所以我們可以合并儲(chǔ)存。

關(guān)于河流的全局?jǐn)?shù)據(jù),我們儲(chǔ)存了如下信息,其中RG通道儲(chǔ)存河流velocity的兩個(gè)分向量,也就是flow map,B通道儲(chǔ)存了河流的吸收率控制顏色,A通道保存了河流的泡沫區(qū)域,這些數(shù)據(jù)在shader 使用上端手會(huì)有些差異。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

根據(jù)flow map進(jìn)行多次采樣即可模擬水波流動(dòng)的感覺(jué),由于周期內(nèi)波浪是循環(huán)重復(fù)的,所以循環(huán)采樣的次數(shù)越多,其流動(dòng)表現(xiàn)就會(huì)更加自然。

對(duì)于PC我們對(duì)波浪法線(xiàn)進(jìn)行3次采樣,每層之間的過(guò)度通過(guò)余弦函數(shù)作為權(quán)重進(jìn)行混合,此外還有模擬了更銳利的小型波浪。

對(duì)于手游高配,只需要減少一次采樣,每1/2周期進(jìn)行混合即可;對(duì)于性能較低的機(jī)型,直接使用簡(jiǎn)單的線(xiàn)性周期混合,節(jié)省cos指令的負(fù)擔(dān)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在顏色方面,我們使用剪切映射中的吸收蒙版來(lái)定義水的基本渾濁度,將吸收LUT和散射LUT映射到一起,共同描述水的顏色和散射顏色。這使我們無(wú)需額外的Draw即可處理自然的水表現(xiàn),例如區(qū)分河流、湖泊以及泥沙被沖走的效果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

手游的水使用半透明渲染,在數(shù)據(jù)使用上與pc不同的地方在于減少了散射的成分,所以只采樣了pc的absorption LUT。

同時(shí)映射了LUT的alpha通道用來(lái)模擬水的渾濁度,這很好理解,水越渾濁 越深的區(qū)域,光線(xiàn)穿透率越低,它會(huì)更加的不透明,關(guān)于半透明這一點(diǎn)其實(shí)我們還做了更多的擴(kuò)展優(yōu)化,畢竟手機(jī)上的算力實(shí)在珍貴。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

如前面講的一樣,大部分水比較深的地方幾乎傾向于不透明狀態(tài),并且我們目前沒(méi)有水下玩法,所以對(duì)于標(biāo)準(zhǔn)地形渲染,半透明銜接處,以及幾乎不透明的深水域做了不同程度的性能優(yōu)化,大大降低了GPU clock的開(kāi)銷(xiāo)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

關(guān)于水面反射,在PC端上用了Screen Space reflection和多個(gè)IBL相結(jié)合的方式。

在移動(dòng)端上,因?yàn)樾阅芸剂?,目前則是只有使用IBL,不過(guò)為了整體視覺(jué)上的相對(duì)正確性,人為的去修改IBL。

最后,我們將wetness信息打包到clipmap中,來(lái)作為濕潤(rùn)地形,濕潤(rùn)巖石,水坑等的輸入。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

clipmap只有每米一個(gè)像素的精度,但是在地形上我們可以采樣高度layer,與wet mask閾值混合后就可以獲得正確豐富的darkness 區(qū)域,對(duì)darkness mask灰度裁切能夠得到水坑的區(qū)域。

這種方式實(shí)現(xiàn)潮濕以及水坑,相比decal的方式可以省去額外的drawcall,水坑效果將于地形一同繪制。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

同時(shí)這些潮濕的區(qū)域通過(guò)clipmap作為介質(zhì)儲(chǔ)存后,就可以使得其他內(nèi)容進(jìn)行采樣,比如我們的巖石,這讓環(huán)境間有了真實(shí)互動(dòng)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

對(duì)于植物來(lái)說(shuō),全局光照對(duì)其最終表現(xiàn)影響很大,而其中ao是最重要的表現(xiàn),對(duì)于PC我們應(yīng)用了SSRTAO 作為全局光照遮蔽,同時(shí)從紋理中補(bǔ)充一些細(xì)微結(jié)構(gòu)的ao。植物預(yù)烘培的頂點(diǎn)ao只會(huì)作用在subsurface上用來(lái)擬合多次散射的遮蔽效果。

對(duì)于手游的植物則僅有頂點(diǎn)ao。對(duì)于草來(lái)說(shuō)只需要通過(guò)額外的uv就能獲得ao;除了對(duì)環(huán)境光進(jìn)行遮蔽以外,在手游上ao還會(huì)參與計(jì)算假陰影,這對(duì)于手機(jī)上的植被表現(xiàn)很重要。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

無(wú)論是頂點(diǎn)還是像素著色的預(yù)算面對(duì)畫(huà)面中大量的植物來(lái)說(shuō)都是非常昂貴的,其中陰影消耗是非常重的一塊。

對(duì)于樹(shù)來(lái)說(shuō)我們不僅要減少植物插片的數(shù)量和頂點(diǎn),同時(shí)繪制陰影時(shí)會(huì)使用更低級(jí)別的lod模型,但是這同時(shí)帶來(lái)了難以接受的低質(zhì)量陰影,你可以看到影子精度很低,同時(shí)有生硬的邊緣。

將頂點(diǎn)ao作用到直接光shading上來(lái)近似陰影,可以獲得更加平滑的暗部過(guò)度,同時(shí)減少了采樣陰影帶來(lái)的負(fù)擔(dān)

通過(guò)對(duì)假陰影的調(diào)整,也可以近似模擬出植物多次透射的效果,使暗部不會(huì)過(guò)于發(fā)黑。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

最終你能看到更穩(wěn)定,更穩(wěn)定,更加統(tǒng)一整體的樹(shù)冠表現(xiàn),最重要的是性能方面非常省。

草的像素面積和頂點(diǎn)甚至?xí)葮?shù)更多,所以不會(huì)投射影子也不會(huì)采樣影子;

我們通過(guò)逐instance的隨機(jī)和ao混合作為假陰影,這和樹(shù)是類(lèi)似的,稍微復(fù)雜點(diǎn)的是fake shadow會(huì)根據(jù)視距和視線(xiàn)角度進(jìn)行衰減,遠(yuǎn)處和低頭查看草時(shí)不會(huì)產(chǎn)生生硬的黑色過(guò)渡。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

此外草同時(shí)也不會(huì)投射影子,它們數(shù)量太多了。

我們?cè)赾lipmap中烘培了草的位置信息以供地形采樣, 為地形做了額外的直接光和高光遮蔽,這很好的緩解了沒(méi)有投影時(shí)地形和草的銜接問(wèn)題。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

為了能在各個(gè)平臺(tái)上都有比較好的性能和效果表現(xiàn),植被遠(yuǎn)景的方案端游和手游有比較大的不同,因此我們準(zhǔn)備了3套不同的方案來(lái)應(yīng)對(duì)。

首先,是用impostor方案,它只用在PC端,并且同時(shí)作為植被的最后一級(jí)LOD。

然后就是Billboard,作為只針對(duì)手游用的遠(yuǎn)景模型,大大降低了渲染壓力,并且能保證有不錯(cuò)的效果。

最后就是cluster Card,它是真正意義上的backdrop,適用于地圖的邊界,以及完全gampplay無(wú)法觸及的區(qū)域。并且在雙端上有應(yīng)用。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

首先,讓我們來(lái)看看Impostor。我們使用了一種相當(dāng)常見(jiàn)的技術(shù),這在之前的許多演講和論文中都有提及——它實(shí)際上是一種基于mesh card的方法。它的概念非常簡(jiǎn)單,從不同角度捕捉卡片,得到最適合的面,然后在模型的剩余部分重復(fù)這個(gè)過(guò)程,直到?jīng)]有剩余部分。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們發(fā)現(xiàn),這種方法對(duì)于團(tuán)簇狀的樹(shù)冠有不錯(cuò)的生成結(jié)果。

但是如果一股腦的對(duì)所有樹(shù)木,或某些種類(lèi)的整棵樹(shù)進(jìn)行card生成和紋理捕獲,會(huì)存在著card的濫用以及紋理的浪費(fèi)。

我們有多個(gè)地圖,不同的地域,植被類(lèi)型會(huì)多種多樣,截然不同。為了更好的壓榨出性能,我們有自己的處理方式。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們是這么做的:

我們將樹(shù)冠和樹(shù)干進(jìn)行了拆分生成,然后用盡量少并且更貼合樹(shù)木模型的card對(duì)其分別進(jìn)行紋理捕獲和生成。通常只要3個(gè)面也就能表現(xiàn)出令人滿(mǎn)意的樹(shù)干。

兩者的分開(kāi)生成的還有一個(gè)好處就是,我們可以對(duì)其進(jìn)行不同處理,比如樹(shù)冠需要更強(qiáng)調(diào)團(tuán)簇感和體積感,而樹(shù)干樹(shù)枝則不需要,最后將2者進(jìn)行合并。

獨(dú)立生成這兩部分的另一個(gè)優(yōu)點(diǎn)是我們可以不同地對(duì)待它們。例如,樹(shù)冠需要更多地強(qiáng)調(diào)簇狀和體積,而樹(shù)干和樹(shù)枝則不需要。最后,我們將這兩部分合并成一個(gè)整體。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

同時(shí),我們對(duì)整棵樹(shù)進(jìn)行了dither temporal AA來(lái)得到順滑的過(guò)度,通過(guò)vertex color存的信息區(qū)分,分別對(duì)樹(shù)冠和樹(shù)枝進(jìn)行了不一樣的調(diào)參設(shè)置,減輕樹(shù)干插片感的同時(shí),保證樹(shù)冠有更高的密度。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

相比PC的impostor,billboard比較廣泛的應(yīng)用在性能比較低端的平臺(tái),對(duì)性能更加友好。在這里,我們手機(jī)平臺(tái),處理所用的植被遠(yuǎn)景都用這個(gè)方法。

針對(duì)不同的樹(shù)木外貌特性,我們處理billboard的方法也會(huì)不同。我們大致有3種方法來(lái)處理:

首先是Single-plane billboard,這是最為常見(jiàn)的billboard方式。我們對(duì)于場(chǎng)景中大多比較對(duì)稱(chēng)植被用采用這種辦法,我們會(huì)選擇一個(gè)比較適合的視角進(jìn)行捕捉,無(wú)論玩家在世界中所處什么樣的位置,billboard總是朝向玩家。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

難以避免還有不少植被是非對(duì)稱(chēng)的,如果用Single-plane billboard的話(huà),會(huì)導(dǎo)致無(wú)數(shù)遠(yuǎn)處植被視覺(jué)跳變的問(wèn)題。因此對(duì)于這類(lèi)的植被,我們則用了double planes billboard的方法,捕獲外形差異比較大的2個(gè)角度,且又相差90度的的紋理。

貼在2片平行的平面上,并且和single plane billboard一樣,永遠(yuǎn)朝向玩家。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

然后,當(dāng)視角發(fā)生變化后用dither來(lái)順滑過(guò)度2者的切換。

最后,通過(guò)根據(jù)攝像機(jī)機(jī)位的距離來(lái)動(dòng)態(tài)調(diào)整2片面的間距,從而防止遠(yuǎn)處觀(guān)察的z-fighting問(wèn)題。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

另外一種billboard我們稱(chēng)之為T(mén)itled Plane。

通常這種樹(shù)的輪廓是非常傾倒,極為不對(duì)稱(chēng)的。例如椰棗樹(shù)。

我們抓取相對(duì)最對(duì)稱(chēng)的角度作為紋理原圖,然后在shader中進(jìn)行操作將其壓倒。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

簡(jiǎn)單的來(lái)說(shuō)就是,我們區(qū)分了樹(shù)干和樹(shù)冠部分,對(duì)樹(shù)冠進(jìn)行偏移,旋轉(zhuǎn),甚至扭曲。對(duì)于樹(shù)干進(jìn)行彎曲曲率的調(diào)整以及起始點(diǎn)的偏移等等。

這是一個(gè)非常主觀(guān)的操作,力求將造型與實(shí)際模型對(duì)齊。通過(guò)lerp計(jì)算,最終在一個(gè)面片上還原歪斜樹(shù)木的結(jié)果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

另外要提的一點(diǎn)是,無(wú)論是哪種類(lèi)型的biiboard,我們?cè)趧?chuàng)建之初,對(duì)于面片的尺寸做了均一化處理,無(wú)論樹(shù)木的實(shí)際尺寸是怎樣的。

然后我們?cè)趕hading中進(jìn)行尺寸的調(diào)節(jié)來(lái)匹配真實(shí)性,從而能更好的對(duì)其進(jìn)行合批操作,大大降低渲染性能開(kāi)銷(xiāo)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

對(duì)于遠(yuǎn)景山上,以及無(wú)法觸及到的樹(shù)木森林,我們會(huì)做更極致的優(yōu)化。

這是對(duì)于billboard的延展,美術(shù)會(huì)手動(dòng)組合各種樹(shù)木的billboard,形成成簇。

從然捕獲長(zhǎng)條形的群簇作為原始紋理,貼在條狀面片上,從而構(gòu)成我們所謂的cluster card。

各種不同類(lèi)型的billboard組合,構(gòu)成了Assembly card的多樣性,從而組成為DF世界的遠(yuǎn)景和非觸達(dá)區(qū)域的森林。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

好的,現(xiàn)在我們來(lái)談?wù)勎覀冊(cè)诔绦蚧矫娴膶?shí)現(xiàn)。關(guān)于程序化世界生成,業(yè)界已經(jīng)有許多成熟的解決方案。

我們依然用的是基于houdini的開(kāi)發(fā)流程, Offline生成結(jié)果。獲取地形信息,根據(jù)特定的生成規(guī)律,生成點(diǎn)云,返回到引擎,并且實(shí)例化生態(tài)數(shù)據(jù)。由于這種做法比較普遍,我就不多展開(kāi)了。相反,我將更多地討論我們?nèi)绾芜M(jìn)行跨平臺(tái)實(shí)現(xiàn)。當(dāng)然,首先是我們剛才談到的Clipmap。存儲(chǔ)在其中的大部分?jǐn)?shù)據(jù)都是由PCG生成和修改的。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在我們的游戲中,幾乎所有的地形和生物群落都是結(jié)合在一起的,并且基于配方,我們?yōu)樗囆g(shù)家和內(nèi)容創(chuàng)作者提供了畫(huà)筆工具作為預(yù)設(shè)。預(yù)設(shè)包括地形、植被資產(chǎn)、貼花和VFX(例如落葉、漂浮的灰塵、煙霧、霧氣等)。藝術(shù)家只需選擇相應(yīng)的預(yù)設(shè),在世界中他們想要的地方進(jìn)行繪制,而無(wú)需進(jìn)行任何額外的步驟或設(shè)置。

這使我們能夠在編輯器中使用一套預(yù)設(shè)工具,但我們的配方是完全解耦的,這意味著同一個(gè)配方在每個(gè)平臺(tái)上都有單獨(dú)的HDA文件。最后,我們?cè)赑C和移動(dòng)設(shè)備上得到不同的結(jié)果,主要是為了應(yīng)對(duì)平臺(tái)限制和性能問(wèn)題。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

盡管PC和移動(dòng)設(shè)備是兩個(gè)獨(dú)立的管線(xiàn),但由于它們共享相同的生物群落類(lèi)型,我們?nèi)匀幌M鼈兙哂邢嗨频耐庥^(guān)。當(dāng)然,在創(chuàng)建和迭代過(guò)程中,我們也不希望做兩次工作。因此,我們尋找兩個(gè)版本之間的繼承關(guān)系,并在Houdini中進(jìn)行降級(jí)操作。我們的方法是鎖定配方中的高優(yōu)先級(jí)元素,并將其繼承到移動(dòng)設(shè)備版本,同時(shí)去掉不太重要的元素,如矮樹(shù)、小灌木和裝飾物。這就得到了一個(gè)簡(jiǎn)化的移動(dòng)設(shè)備版本,總體上保持了相似的外觀(guān)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

而且,如果我們?nèi)匀淮嬖谝恍┬阅軣狳c(diǎn),僅減少配方復(fù)雜度無(wú)法滿(mǎn)足要求,我們還設(shè)計(jì)和創(chuàng)建了專(zhuān)用的配方,在某些區(qū)域更激進(jìn)地降級(jí)密度和類(lèi)別。你可以將其視為僅限移動(dòng)設(shè)備或移動(dòng)設(shè)備專(zhuān)用的工具,僅影響移動(dòng)設(shè)備版本。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們盡量使生物群落盡可能基于預(yù)設(shè),但為了滿(mǎn)足非常特定的游戲玩法需求,我們也提供了手動(dòng)放置樹(shù)木和大灌木的靈活性。但周?chē)难b飾會(huì)進(jìn)入程序化處理。

最后,細(xì)節(jié)將在周?chē)?,并且與整體環(huán)境很好地集成。

我們實(shí)現(xiàn)了自動(dòng)修正來(lái)處理大塊植被的重疊和交叉。像棕櫚樹(shù)總是最好的例子。首先,我們需要找到一種方法來(lái)驗(yàn)證它們是否交叉。因此,我們將幾何體體素化,3D體素相當(dāng)于具有值1的3D數(shù)組。如果多個(gè)3D數(shù)組的和的最大值等于2或更大,這意味著模型交叉了。接下來(lái),我們自動(dòng)更改其中一個(gè)模型的方向。然后,再次進(jìn)行驗(yàn)證和修正。并反復(fù)這個(gè)過(guò)程,直到?jīng)]有交叉。這樣,我們?cè)赑C和移動(dòng)設(shè)備上都確保了所有樹(shù)木都放置得正確美觀(guān)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

草漂浮是一個(gè)普遍的問(wèn)題,尤其是在移動(dòng)設(shè)備上。由于預(yù)算和性能限制,移動(dòng)設(shè)備上草簇模型的邊界框通常很大。我們所做的第一件事是向地形投射射線(xiàn),測(cè)量草模型的支點(diǎn)與地形本身的距離。如果結(jié)果超過(guò)閾值,將漂浮的草稍微向下拉。再進(jìn)行一次驗(yàn)證,移除漂浮的草,或者如果性能允許,用較小的草替換。

由于一切都由PCG控制,因此我們可以調(diào)整密度以減少三角形數(shù)量,或者替換某些類(lèi)型的模型以減少Drawcall,靈活地實(shí)現(xiàn)每個(gè)質(zhì)量級(jí)別的視覺(jué)和性能的最佳平衡。最后,我們得到了在感知上相似的PC和移動(dòng)設(shè)備版本,同時(shí)根本上滿(mǎn)足了兩個(gè)平臺(tái)的質(zhì)量和性能需求。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

最后,道路也是地形的一部分,所以我來(lái)展開(kāi)說(shuō)一下我們?cè)谶@方面做出的一些優(yōu)化。在一些低端移動(dòng)手機(jī)上,由于性能限制,我們無(wú)法支持VT(虛擬紋理)。而且,我們的地形精度也從每格1米降低到每格2米。正如你所見(jiàn),道路和地形幾乎到處可見(jiàn)得重疊,Z-fighting非常嚴(yán)重。所以,即使輸入數(shù)據(jù)相同,每個(gè)平臺(tái)的處理方法也需要有所不同。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在程序化處理過(guò)程中,我們?yōu)榈投嗽O(shè)備生成額外的道路模型,拓?fù)浣Y(jié)構(gòu)需要更改為2米以精確匹配地形網(wǎng)格。這樣視覺(jué)上看起來(lái)正確,但這導(dǎo)致了另一個(gè)問(wèn)題,即三角形數(shù)量急劇增加,低端設(shè)備也無(wú)法承受。因此,我們對(duì)遠(yuǎn)處的道路進(jìn)行減面來(lái)作為L(zhǎng)OD模型。為了避免重疊再次出現(xiàn),此外,在頂點(diǎn)著色器中,我們將遠(yuǎn)處的頂點(diǎn)漸進(jìn)逐漸向上拉。最后看起來(lái)一切都很完美。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在下面內(nèi)容中,我們的引擎程序員組長(zhǎng)焦航,將帶大家了解核心技術(shù)特性。

分享嘉賓:

焦航 騰訊游戲天美J3工作室引擎組負(fù)責(zé)人

大家好,我是焦航,來(lái)自琳瑯天上的引擎團(tuán)隊(duì)負(fù)責(zé)人。你們可以叫我Jesse。過(guò)去十年,我一直在移動(dòng)游戲開(kāi)發(fā)領(lǐng)域深耕,參與過(guò)《穿越火線(xiàn)手游》《使命召喚手游》等成功項(xiàng)目的開(kāi)發(fā)——這些都是基于Unity引擎實(shí)現(xiàn)的。今天,我將以我們使用虛幻引擎4.24開(kāi)發(fā)的《三角洲行動(dòng)》游戲?yàn)槔?,帶大家揭秘游戲中地形與生態(tài)群落渲染背后的技術(shù)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

首先,我們來(lái)聊聊地形貼圖技術(shù)。

正如上篇中Lichuan之前提到的,我們使用VT技術(shù)處理地形貼圖。VT本質(zhì)上是一種紋理緩存算法,能有效節(jié)省帶寬。同時(shí)這項(xiàng)技術(shù)支持在地形上疊加大量貼花,讓我們能在PC和移動(dòng)端實(shí)現(xiàn)高品質(zhì)的地形渲染。在虛幻引擎中,我們采用的是adaptive VT方案。

在移動(dòng)端使用VT時(shí),我們需要在寫(xiě)入VT前,對(duì)紋理進(jìn)行運(yùn)行時(shí)壓縮。如果不壓縮,每幀都會(huì)消耗大量帶寬,導(dǎo)致設(shè)備發(fā)熱。因此,我們將其壓縮為ASTC 4 * 4或6 * 6格式。我們采用了極簡(jiǎn)算法,僅支持ASTC的雙端點(diǎn)模式,不含ASTC的分區(qū)模式。出于兼容性考慮,我們?cè)谒幸苿?dòng)設(shè)備上使用pixel shader執(zhí)行壓縮。首先通過(guò)pixel shader輸出到uint4紋理,每個(gè)像素128位,對(duì)應(yīng)ASTC的block大小。接著將紋理復(fù)制到buffer,最后再?gòu)?fù)制給壓縮紋理。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

這是實(shí)際效果:帶寬方面,每幀帶寬減少到原先的四分之一或九分之一。PSNR值穩(wěn)定在40到50區(qū)間,美術(shù)團(tuán)隊(duì)對(duì)最終視覺(jué)效果表示認(rèn)可。單張VT頁(yè)面的壓縮耗時(shí)僅需0.2毫秒。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

接下來(lái)聊聊地形貼圖的基礎(chǔ)——splat map。我們?cè)陔p平臺(tái)使用基本相同的splat map方案,這使移動(dòng)端也能獲得高品質(zhì)地形。在移動(dòng)端,我們將PBR紋理的多個(gè)通道打包到更少的貼圖中。具體來(lái)說(shuō),我們用了兩個(gè)texture arrays:一個(gè)存儲(chǔ)albedo和heightmap,另一個(gè)儲(chǔ)存normal、roughness及ambient occlusion。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

來(lái)看看先來(lái)看看我們的需求:美術(shù)想要至少32層材質(zhì)混合,以提升場(chǎng)景豐富度。這需要某種形式的ID map方案支持。想要實(shí)現(xiàn)基于高度的權(quán)重混合,且權(quán)重可控——這種混合方式能讓兩個(gè)材質(zhì)在大范圍漸變過(guò)渡,使交界更自然。這需要地形上每個(gè)點(diǎn)需要為每層材質(zhì)單獨(dú)存儲(chǔ)權(quán)重值。同時(shí)受帶寬限制,紋理采樣次數(shù)必須嚴(yán)格控制。但,等等,常規(guī)的每層權(quán)重方案(比如虛幻引擎默認(rèn)方案)無(wú)法支持如此多層,因?yàn)槊恳粚淤N圖都需要采樣做混合。而ID map方案(如《孤島驚魂》《幽靈行動(dòng)》采用的方式)又不支持權(quán)重混合,每個(gè)點(diǎn)只能指定單一材質(zhì)ID。我們?cè)撛趺崔k呢?

打開(kāi)網(wǎng)易新聞 查看精彩圖片

讓我們從最基礎(chǔ)方案開(kāi)始,化繁為簡(jiǎn)。首先為所有材質(zhì)層設(shè)定明確的順序,采用從底層到頂層的覆蓋邏輯。在地形每個(gè)采樣點(diǎn)存儲(chǔ)兩個(gè)layer ID:底層(bottom)和頂層(top)。禁止同一位置出現(xiàn)三層疊加。這樣底層權(quán)重始終為1,只需存儲(chǔ)頂層(top)的混合權(quán)重值。我們采用每米一個(gè)采樣點(diǎn)的ID map精度存儲(chǔ)這些數(shù)據(jù)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

生成ID map的具體流程是:美術(shù)師在編輯器中正常為每層材質(zhì)繪制權(quán)重,我們會(huì)在每個(gè)地形采樣點(diǎn),篩選出權(quán)重最高的兩個(gè)材質(zhì)層保留下來(lái)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

接下來(lái),地形上的每個(gè)像素需要獲取周?chē)?個(gè)采樣點(diǎn),并進(jìn)行插值計(jì)算。這意味著每個(gè)像素需要采樣4個(gè)ID map點(diǎn),進(jìn)而采樣8個(gè)材質(zhì)層,在移動(dòng)端總計(jì)產(chǎn)生20次采樣。這樣的開(kāi)銷(xiāo)顯然過(guò)大,必須進(jìn)行優(yōu)化。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

首先引入一個(gè)小技巧:我們可以將插值計(jì)算范圍從方形區(qū)域改為在三角形區(qū)域進(jìn)行插值。這樣能將材質(zhì)層采樣數(shù)從8層降至6層。雖然地面可能出現(xiàn)輕微三角形pattern的感覺(jué),但通過(guò)合理的層混合,這種pattern幾乎不可察覺(jué)。不過(guò)6層采樣依然偏高——實(shí)際開(kāi)發(fā)中美術(shù)師很少在同一區(qū)域疊加這么多層。如果我們利用這個(gè)特性,將不同的ID數(shù)量從6個(gè)減少到3個(gè)呢?這樣雖然仍有6個(gè)ID編號(hào),但實(shí)際只需采樣3個(gè)材質(zhì)層。經(jīng)過(guò)實(shí)際測(cè)試,我們發(fā)現(xiàn)3層是保證正常過(guò)渡的最低標(biāo)準(zhǔn),同時(shí)足以呈現(xiàn)復(fù)雜的地形效果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

那么我們?nèi)绾螐娜切蝺?nèi)的6個(gè)ID中提取3個(gè)獨(dú)立層?我們通過(guò)離線(xiàn)ID修復(fù)流程實(shí)現(xiàn)這一點(diǎn)。當(dāng)美術(shù)師在編輯器中繪制權(quán)重時(shí),每個(gè)三角形會(huì)包含6個(gè)層ID:3個(gè)底層ID和3個(gè)頂層ID。流程開(kāi)始時(shí),創(chuàng)建一個(gè)容量為3的空集合。首先將3個(gè)底層ID全部加入集合。若集合未滿(mǎn)(存在重復(fù)ID),繼續(xù)按權(quán)重從高到低的順序逐個(gè)添加頂層ID。若集合已滿(mǎn),則丟棄,具體做法是將多余頂層ID設(shè)置為與底層ID相同。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

由于只是移除多余ID,處理相鄰三角形時(shí)不會(huì)破壞當(dāng)前三角形數(shù)據(jù)。現(xiàn)在這6個(gè)ID中僅保留3個(gè)不同的值。還記得我們?yōu)椴馁|(zhì)層設(shè)定了明確順序嗎?因此頂層ID始終大于底層ID。接下來(lái)需要在shader中從這6個(gè)數(shù)值中提取3個(gè)ID,分別命名為min、mid和max。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在shader中,每個(gè)待渲染像素首先需解碼3個(gè)ID map采樣點(diǎn),獲取6個(gè)ID編號(hào)及3個(gè)權(quán)重值。隨后通過(guò)這段代碼,從6個(gè)ID中提取出min、mid和max三個(gè)核心ID。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

最終,我們能在每個(gè)三角形頂點(diǎn)獲取各材質(zhì)層的權(quán)重值,并完成混合計(jì)算。相關(guān)PPT稍后會(huì)上傳至GDC Vault平臺(tái)。接下來(lái)我將繼續(xù)講解。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

總結(jié)來(lái)看:相比傳統(tǒng)的weight-per-layer方案,我們的方法支持更多材質(zhì)層疊加。相較《孤島驚魂》《幽靈行動(dòng)》采用的ID map方案,我們實(shí)現(xiàn)了權(quán)重混合功能。傳統(tǒng)ID map方案要實(shí)現(xiàn)過(guò)渡效果,必須創(chuàng)建包含兩種材質(zhì)的混合層,這會(huì)額外消耗內(nèi)存。而我們的方案可以任意兩層材質(zhì)自由混合,無(wú)需占用額外內(nèi)存。此外,這種混合機(jī)制還能實(shí)現(xiàn)類(lèi)似《巫師3:狂獵》的法線(xiàn)疊加與衰減等高級(jí)效果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

關(guān)于懸崖渲染:在VT方案中,UV通常基于世界坐標(biāo)的XY軸投影,這會(huì)導(dǎo)致懸崖面出現(xiàn)紋理拉伸。常規(guī)解決方案是采用tri-planar映射——需要額外增加X(jué)Z和YZ軸的紋理投影采樣,并進(jìn)行混合。但這會(huì)導(dǎo)致每幀的額外性能開(kāi)銷(xiāo)。目前存在tri-planar的優(yōu)化方案,不過(guò)通常仍需在base pass中增加紋理采樣次數(shù)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

那么為何不直接將tri-planar映射渲染到VT中呢?讓我具體說(shuō)明:可以看到XY軸投影,僅在平坦區(qū)域表現(xiàn)良好。在懸崖垂直面上,如果繼續(xù)使用XY軸投影,UV坐標(biāo)會(huì)產(chǎn)生嚴(yán)重拉伸變形。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在懸崖面使用XZ或YZ軸投影時(shí),UV在模型表面不會(huì)拉伸——雖然這可能導(dǎo)致VT頁(yè)面內(nèi)的紋理拉伸,但實(shí)際渲染時(shí)mesh本身不會(huì)拉伸。所以一個(gè)簡(jiǎn)單的計(jì)算UV的方法是:在生成VT的繪制階段,對(duì)每個(gè)像素:檢測(cè)法線(xiàn)方向(normal direction),基于此自動(dòng)選擇最佳投影平面(XY/XZ/YZ),并使用該UV,繪制這個(gè)像素。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

要實(shí)現(xiàn)這一點(diǎn),我們需要引入Z軸坐標(biāo)。必須將實(shí)際地形網(wǎng)格輸入VT生成流程,而非之前的quad。注意要使用SampleGrad方法——由于每個(gè)像素的UV動(dòng)態(tài)變化,必須手動(dòng)指定正確的mipmap層級(jí)。這是優(yōu)化后的效果:可以看到紋理拉伸消失了,但出現(xiàn)了明顯接縫。如何消除接縫?

打開(kāi)網(wǎng)易新聞 查看精彩圖片

解決接縫問(wèn)題,我們采用受《Far Cry》啟發(fā)的隨機(jī)分布方案。令人驚喜的是,在VT中這種處理顯得非常自然:由于VT緩沖區(qū)不會(huì)頻繁刷新,幀間穩(wěn)定性得到保證;同時(shí)得益于mipmapping機(jī)制,避免了aliasing鋸齒問(wèn)題。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

最終我們以極低成本實(shí)現(xiàn)了類(lèi)似Tri-planar的效果。我們也嘗試過(guò)bi-planar方案,雖然混合效果更好但性能開(kāi)銷(xiāo)更大。隨機(jī)方案在效果與性能間達(dá)到平衡,最終成為游戲內(nèi)的實(shí)裝方案。不過(guò)直接在VT中渲染懸崖存在一個(gè)限制——當(dāng)玩家近距離觀(guān)察時(shí),最大分辨率會(huì)有所下降。我們認(rèn)為這是一個(gè)可接受的取舍。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

這里還有另一個(gè)提升視覺(jué)質(zhì)量的技巧:使用高度混合時(shí),近處效果良好,但遠(yuǎn)景會(huì)出現(xiàn)塊狀瑕疵——這是因?yàn)檫h(yuǎn)距離混合使用高LOD層級(jí)的mipmap,精度不足導(dǎo)致。除了調(diào)整遠(yuǎn)景tiling之外,我們還引入了另一個(gè)技巧。我們?cè)谶h(yuǎn)處采用線(xiàn)性混合方案:隨著距離增加,逐步過(guò)渡到線(xiàn)性混合模式。這種處理使過(guò)渡更柔和,有效解決了塊狀瑕疵。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

這里還有另一個(gè)運(yùn)行時(shí)出現(xiàn)的問(wèn)題:美術(shù)師在編輯器中精心雕琢的地形細(xì)節(jié),在移動(dòng)端運(yùn)行時(shí)——尤其是遠(yuǎn)景中——會(huì)顯得過(guò)于平坦,溝壑與侵蝕細(xì)節(jié)被平滑掉了。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

根本原因在于:編輯器中地形使用38萬(wàn)三角面,而運(yùn)行時(shí)版本僅保留8萬(wàn)面。出于性能考量,我們大幅降低了遠(yuǎn)景區(qū)域的網(wǎng)格密度。這意味著通過(guò)頂點(diǎn)法線(xiàn)(vertex normal)表現(xiàn)的幾何細(xì)節(jié)也隨之減少。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

為恢復(fù)這些細(xì)節(jié),我們引入Streaming Virtual Textures(流式虛擬紋理)解決方案。既然遠(yuǎn)景區(qū)域的網(wǎng)格無(wú)法存儲(chǔ)足夠頂點(diǎn)法線(xiàn)細(xì)節(jié),我們就將其烘焙到紋理中。將整個(gè)地形的低層級(jí)mipmap烘焙成SVT格式。在VT生成階段,當(dāng)收到頁(yè)面請(qǐng)求時(shí),我們會(huì)檢查是否存有SVT數(shù)據(jù)。若存在,則直接將數(shù)據(jù)載入physical texture,而非通過(guò)RVT方式實(shí)時(shí)渲染。SVT與RVT共享同一塊physical texture內(nèi)存,因此不會(huì)產(chǎn)生額外內(nèi)存消耗。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

因此,我們將頂點(diǎn)法線(xiàn)(vertex normal)烘焙到SVT中,并在最終渲染時(shí)完全忽略地形網(wǎng)格自帶的法線(xiàn)信息——所有法線(xiàn)數(shù)據(jù)都來(lái)自SVT。但SVT與近景RVT混合時(shí),必須采用相同的法線(xiàn)生成邏輯才能避免接縫。這意味著在生成RVT時(shí),同樣需要通過(guò)實(shí)際地形網(wǎng)格實(shí)時(shí)渲染頂點(diǎn)法線(xiàn)——就像處理懸崖渲染時(shí)一樣。最終效果令人滿(mǎn)意:遠(yuǎn)景地形細(xì)節(jié)完全保留,不再出現(xiàn)細(xì)節(jié)丟失。美術(shù)團(tuán)隊(duì)甚至可以通過(guò)手動(dòng)調(diào)整離線(xiàn)生成的SVT數(shù)據(jù),自由定制遠(yuǎn)景視覺(jué)效果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

此外,游戲中還有許多細(xì)節(jié)調(diào)優(yōu)案例。例如在這款快節(jié)奏FPS游戲中,開(kāi)鏡時(shí)攝像機(jī)FOV(視野)會(huì)急速變化,導(dǎo)致VT需要立即重繪更高精度內(nèi)容——這會(huì)產(chǎn)生明顯的地形突變(pop-in)現(xiàn)象,干擾玩家索敵。因此我們?cè)陂_(kāi)鏡時(shí)引入額外偏移值(bias),使FOV變化時(shí)維持當(dāng)前mip level。該方案顯著提升了操作流暢度,代價(jià)是開(kāi)鏡時(shí)地形會(huì)略顯模糊。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

接下來(lái)我們將深入探討地形幾何結(jié)構(gòu)。

在虛幻引擎默認(rèn)方案中,每塊地形tile都需要單獨(dú)Draw Call,導(dǎo)致渲染整個(gè)地形需要大量繪制調(diào)用。這在移動(dòng)設(shè)備上會(huì)產(chǎn)生巨大開(kāi)銷(xiāo)。因此我們采用CDLOD(Continuous Distance-Dependent Level of Detail)方案渲染地形網(wǎng)格。該技術(shù)通過(guò)draw instance同時(shí)渲染所有LOD層級(jí)的地形tile。每個(gè)實(shí)例對(duì)應(yīng)一個(gè)網(wǎng)格單元——離攝像機(jī)越近的單元尺寸越小,越遠(yuǎn)的單元尺寸越大。所有實(shí)例保持相同頂點(diǎn)數(shù),因此近處網(wǎng)格更密集,遠(yuǎn)處更稀疏。通過(guò)這種方式,整個(gè)地形只需1——2個(gè)Draw Call即可完成渲染。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

此外,我們還通過(guò)一個(gè)小技巧進(jìn)一步降低實(shí)例數(shù)量。常規(guī)情況下,當(dāng)請(qǐng)求某地形tile的高LOD層級(jí)時(shí),會(huì)將其細(xì)分為四個(gè)高LOD子tile,導(dǎo)致需要4個(gè)實(shí)例渲染。但我們采用頂點(diǎn)著色器裁剪方案:將低LOD網(wǎng)格中需要細(xì)分的區(qū)域切割出來(lái),僅對(duì)該區(qū)域進(jìn)行細(xì)分。切割操作通過(guò)頂點(diǎn)著色器動(dòng)態(tài)調(diào)整頂點(diǎn)位置實(shí)現(xiàn)。這使得總實(shí)例數(shù)降至2個(gè),且每個(gè)實(shí)例保持相同頂點(diǎn)數(shù),從而減少總頂點(diǎn)繪制量。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

關(guān)于曲面細(xì)分(tessellation)。硬件曲面細(xì)分存在許多問(wèn)題。它存在性能問(wèn)題,三角形分布模式也不夠理想,可能導(dǎo)致更多誤差。而且在移動(dòng)端并不適用。因此,我們實(shí)現(xiàn)了軟細(xì)分方案。這是對(duì)CDLOD的自然延伸——通過(guò)為地形塊引入LOD -1、-2等級(jí)別,從VT中采樣高度圖來(lái)調(diào)整幾何結(jié)構(gòu)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

關(guān)于軟細(xì)分方案——我們希望附近的幾何密度非常高,并且密度隨著距離增加而快速降低。但CDLOD要求相鄰地形塊的LOD等級(jí)差異只能相差一級(jí)。這種限制會(huì)導(dǎo)致大量冗余地形塊。正如所見(jiàn),我們不得不切割出額外地形塊來(lái)滿(mǎn)足這個(gè)限制。我們放寬了這個(gè)限制,允許對(duì)LOD進(jìn)行多次細(xì)分,同時(shí)保留之前提到的裁剪剔除方法。傳統(tǒng)做法是2x2的細(xì)分,而我們嘗試了4x4和8x8的細(xì)分方式。通過(guò)之前介紹的裁剪技巧,你會(huì)發(fā)現(xiàn)實(shí)例數(shù)量更少了,而且網(wǎng)格密度能以此方式更快降低。我們最終選擇4x4方案,因?yàn)樗谡`差率和實(shí)例數(shù)量之間取得了最佳平衡。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

相比硬件曲面細(xì)分,這種方案性能更優(yōu)、三角形分布模式更優(yōu),誤差也更低。我們已經(jīng)在PC平臺(tái)實(shí)裝了該方案。理論上在移動(dòng)端也能落地,但最終沒(méi)有足夠時(shí)間將其植入正式版本。在中高端機(jī)型上值得嘗試。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

此外,我們還做了多項(xiàng)性能優(yōu)化——針對(duì)時(shí)間和內(nèi)存進(jìn)行了優(yōu)化,更重要的是,針對(duì)移動(dòng)端的發(fā)熱問(wèn)題。

正如Lichuan之前提到的,我們?cè)诙鄠€(gè)場(chǎng)景中使用了clipmap技術(shù)。這種技術(shù)的精髓在于——根據(jù)相機(jī)位置動(dòng)態(tài)加載周邊高精度紋理,遠(yuǎn)處則加載低精度貼圖,具體精度范圍取決于你想要保留細(xì)節(jié)的最遠(yuǎn)距離。這能節(jié)省大量?jī)?nèi)存。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們把splat ID map也改造成了clipmap結(jié)構(gòu)——只有近處才需要高精度數(shù)據(jù)。在實(shí)現(xiàn)上,不再為每個(gè)區(qū)塊單獨(dú)啟用VT renderer,而是通過(guò)whole scene VT renderer統(tǒng)一管理clipmap流式加載。這樣減少了Actor數(shù)量,卡頓現(xiàn)象也隨之緩解。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

如果直接加載全部32層紋理到Texture Array會(huì)消耗過(guò)多內(nèi)存。但在渲染近處地形時(shí),實(shí)際只會(huì)用到其中的部分層。因此我們實(shí)現(xiàn)了動(dòng)態(tài)紋理數(shù)組——按需加載紋理,并填充到數(shù)組的空隙中。渲染中距離地形時(shí)則使用完整的32層數(shù)組,配合更小的mipmap層級(jí)。這樣有效控制了需要加載的全分辨率層數(shù)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們自動(dòng)監(jiān)測(cè)實(shí)際使用的層數(shù),并進(jìn)行可視化圖層檢查。在興趣點(diǎn)(POIs)之間的過(guò)渡區(qū)域,內(nèi)存壓力較低,因此可以適當(dāng)放寬限制以獲得更佳畫(huà)質(zhì)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

還有一個(gè)優(yōu)化思路值得分享。雖然允許每個(gè)像素混合3種不同圖層,但實(shí)際很多區(qū)塊用不到這么多層——比如大面積單一圖層(草地、泥土)或僅混合兩種圖層的區(qū)域占主流??紤]到高頻更新的高精度LOD VT頁(yè)會(huì)頻繁切換進(jìn)出physical texture,我們?yōu)橹髦谱髁巳N變體,根據(jù)即將渲染的VT頁(yè)實(shí)際使用層數(shù)動(dòng)態(tài)選擇著色器變體。這些數(shù)據(jù)是離線(xiàn)統(tǒng)計(jì)生成的,內(nèi)存開(kāi)銷(xiāo)極小。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在移動(dòng)端,我們可以?xún)?yōu)化VT流程中使用的渲染目標(biāo)。理想情況下,VT內(nèi)只需兩張紋理,通過(guò)通道合并來(lái)降低基礎(chǔ)通道的采樣次數(shù)。但由于Decal存在透明度混合,渲染VT頁(yè)時(shí)仍需將透明度通道單獨(dú)保留。之后通過(guò)subpass(或frame buffer fetch)對(duì)通道進(jìn)行重組,使其達(dá)到理想布局。這種操作利用移動(dòng)端的on-chip內(nèi)存,無(wú)需回傳到主內(nèi)存。接著就能進(jìn)行ASTC格式壓縮。更進(jìn)一步——如果檢測(cè)到某個(gè)Tile沒(méi)有透明度混合需求,就直接以理想通道布局繪制到渲染目標(biāo)。這類(lèi)信息同樣是通過(guò)離線(xiàn)烘焙獲取的。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

在設(shè)備適配Scaling方面,我們開(kāi)放了多項(xiàng)參數(shù)調(diào)節(jié)開(kāi)關(guān)。比如說(shuō),不同設(shè)備可設(shè)置不同的最大分辨率——降低分辨率意味著需要更新的VT臟頁(yè)更少。我們還可以調(diào)節(jié)VT的mip偏置,配合紋理數(shù)組的mip偏置。這在低端機(jī)上能節(jié)省部分內(nèi)存。高端設(shè)備使用1米精度的地形高度圖,低端設(shè)備則回退到2米精度——這意味著需要著色的頂點(diǎn)更少。地形網(wǎng)格LOD距離縮放系數(shù)提供了另一種優(yōu)化手段——通過(guò)加快遠(yuǎn)處網(wǎng)格的密度衰減速度來(lái)減少頂點(diǎn)數(shù)量。每幀允許填充的頁(yè)面數(shù)量也可以設(shè)限,從而降低卡頓概率。此外,各向異性紋理采樣(aniso-texture sampling)的等級(jí)也能通過(guò)畫(huà)質(zhì)檔位靈活控制。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

針對(duì)極低端移動(dòng)設(shè)備,我們單獨(dú)設(shè)計(jì)了一套地形渲染方案。這主要是出于兼容性考慮——部分低端機(jī)型存在VT支持問(wèn)題,因此必須找到不依賴(lài)VT的替代方案。具體做法是:在base pass直接渲染splat map。由于缺乏動(dòng)態(tài)紋理數(shù)組支持,只能使用完整32層低分辨率紋理數(shù)組。將每頂點(diǎn)splat層數(shù)壓縮到單層,實(shí)際上回退到ID貼圖方案。移除法線(xiàn)貼圖(normalmap)。由于缺乏Decal支持,道路需要作為獨(dú)立mesh單獨(dú)渲染。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

我們針對(duì)不同機(jī)型精細(xì)調(diào)試了所有參數(shù),確保各檔次設(shè)備都能流暢運(yùn)行,同時(shí)呈現(xiàn)其硬件允許范圍內(nèi)的最佳畫(huà)質(zhì)。這是最終各檔次設(shè)備上的內(nèi)存占用情況。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

這是部分性能測(cè)試數(shù)據(jù)。

我們對(duì)地形渲染性能進(jìn)行了測(cè)試,將本方案與移動(dòng)端主流的4層逐層權(quán)重法進(jìn)行對(duì)比。測(cè)試數(shù)據(jù)均基于驍龍855平臺(tái),且僅渲染地形??梢钥吹綗o(wú)論是高畫(huà)質(zhì)檔還是低畫(huà)質(zhì)檔,本方案在幀率、功耗、帶寬和GPU耗時(shí)上均有優(yōu)勢(shì)。更關(guān)鍵的是,我們還能支持32層材質(zhì)混合以及大量Decal效果。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

以下是今日分享的核心結(jié)論:在地貌與地形渲染方面,我們通過(guò)合理控制復(fù)雜度實(shí)現(xiàn)了跨PC與移動(dòng)端的兼容適配;運(yùn)用程序化生成方法加速迭代并提升品質(zhì);針對(duì)地形貼圖與幾何結(jié)構(gòu)開(kāi)創(chuàng)了獨(dú)特的解決方案;并通過(guò)性能與scaling調(diào)優(yōu)確保方案落地。關(guān)于未來(lái)方向——我們計(jì)劃完善天氣系統(tǒng)的實(shí)現(xiàn)方案,開(kāi)發(fā)水下特性,同時(shí)加強(qiáng)地形法線(xiàn)混合和衰減的調(diào)試以進(jìn)一步提升視覺(jué)表現(xiàn)。

打開(kāi)網(wǎng)易新聞 查看精彩圖片

特別感謝所有杰出的同事——你們才是真正的英雄。感謝Delta Force整個(gè)團(tuán)隊(duì)。感謝GDC組委會(huì)提供這個(gè)分享平臺(tái)。感謝在座各位的聆聽(tīng)。