99国产精品欲av蜜臀,可以直接免费观看的AV网站,gogogo高清免费完整版,啊灬啊灬啊灬免费毛片

網易首頁 > 網易號 > 正文 申請入駐

GDC 2025 | 《三角洲行動》:高性能高品質的端手地形和生態技術

0
分享至

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

分享嘉賓:

王理川 騰訊游戲天美J3工作室技術美術組負責人

大家好,很榮幸能站在這里代表騰訊游戲參加2025年的GDC大會。歡迎大家來到《三角洲行動:高性能高品質的端手地形和生態技術》的分享。首先,請允許我簡單介紹一下自己并提供一些背景信息。

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

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



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

這不是一個純粹的程序講座,而是程序與視覺藝術/技術美術管線工具的結合。那么,讓我們來看一下今天的《三角洲行動》的目標。

《三角洲行動》是一款超寫實主義的FPS游戲,整體渲染解決方案和藝術呈現基于PBR,可以將其視為一個純粹的基于物理的渲染項目。這也是創造自然開放世界的關鍵。

我們的技術框架必須夠高效地為兩個平臺提供游戲,盡管時間和人力都非常有限。當然,最后游戲需要高性能,這意味著它需要在PC和各種移動設備上流暢運行。



好的,讓我們來看看今天的議程。首先,我們會簡要介紹一下《三角洲行動》,以防你們中有人不熟悉這款游戲。然后,我會講解地形和生物群落中的一些核心著色器技術,以便你們在兩個平臺上看到今天的內容。接下來,我會談談我們如何使用程序化工具來幫助生物群落的生成和管理。

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

接下來,我們將深入探討各種性能優化技術。最后,我們將總結一些最后的想法和我們已經在進行的未來工作。

這里有一個幾個月前剛剛發布的視頻片段,應該能為你們提供一些我們正在討論的內容的背景,那么讓我們一起來看看。

好的,現在一起看看我們面臨的技術限制。《三角洲行動》在多個平臺上發布,包括PC和各種移動設備,從低端到高端。我們旨在PC上達到高達4K 144幀,同時在旗艦移動設備上仍能高達120幀。我們在開放世界中有一個完整的晝夜循環,包括室內外環境。因此,世界構建中的生物群落、地形等都需要與一天中的所有時間兼容。我們有一個100平方公里的主要世界,還有一些相對較小的地圖。



說到地圖大小,讓我簡要介紹一下游戲的規模。我們有三種游戲模式:

撤離模式,就像我之前說的,這是主世界,位于一個10公里×10公里的開放世界。在這個巨大的地圖上隨機事件將玩家持續保持熱度。

大規模PVP模式,包含多個4×4和2×2的地圖,每張地圖的具體尺寸由關卡設計師根據游戲目的進行定制。這種模式允許最多64名玩家同時出現在戰場上,同時保持非常高的幀率。并且具有真實的地形,包括軍事車輛、坦克和直升機的宏大戰爭,我們還在這游戲模式中開發了廣泛的戰爭破壞系統和大規模破壞資產。

最后是戰役模式,這是一種非常典型的線性任務游戲模式,重啟經典的黑鷹墜落。這個模式也發生在一個巨大的地圖上。這個模式的地形、環境和游戲體驗將帶你們回到25年前的經典三角洲部隊IP。

我們先來看生物群落,我將重點說說跨平臺的框架。

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



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



簡而言之,剪切映射是一種動態紋理表示,能夠高效地在有限的物理內存中緩存任意大小的紋理,以實現實時渲染速率。大家可以看到,隨著相機移動進行滾動更新,相機范圍內的紋理使用mip0,隨著距離逐級遞減,這種方式可以大幅減少內存占用,同時保證了近距離的精度。有著clipmap的加持,大大降低了內存的占用,原本100M的占用率一下子降低到了2.5M這個級別,使得在手游平臺的落地變為了可能。



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

其中包含了植被的狀態,四季變化,水域數據,地形潮濕等,全部塞到了這張紋理中的各個通道中,它幾乎涵蓋了當前生態的全部信息。各個生態模塊的shader都會采樣這些信息。

并且整個框架端游手游統一,接下來我會逐一展開講解。



首先說一下植被部分,10km的開放世界不同區域、因為生長環境不同,海拔高度等不同植被的健康狀態存在著差異。而在不同游戲模式下,關卡有不同四季的設定。我們希望一個植被資產能有不同的四季表現,從而最高程度的復用資產。

那不得不說一下健康度的概念,你也同樣可以理解為植被四季變化的概念。我們分別在clipmap的R通道和B通道儲存了樹和草的健康度信息。之所以樹木和草分開,是因為在實際應用中,兩者差異明顯,不能共用信息。

此外我們認為戰損也可以算作健康度的一部份,所以我們將戰損狀態也編碼到這2個通道中。

比如0.1-0.85存儲著健康信息或者四季信息,將戰損信息壓縮到0.9-1。



除了clipmap作為全局健康度或者說四季變化的輸入信息外,資產個體則有與之對應的健康變化表現以及戰損的表現。為每個植被資產基于季節創建色彩偏移以及燒毀效果,并將其儲存在獨立的look up table中。通過clipmap中的值采樣LUT,得到看似隨機但是完全可以掌控的結果。并且雙端方案保持一致。



在資產方面,在PC上,我們將一個蒙版打包到法線圖中作為色調蒙版,并在上面使用線性插值與BaseColor進行混合。



在移動設備上,為了進一步優化性能,我們放棄了基本顏色,而是完全依賴于我們所謂的“strands mask”(一種灰度圖),它被打包到法線圖中。因此,輸入數據減少了一個紋理,這大大減少了紋理采樣。在視覺效果上,我們對此都非常滿意。



當植物的不健康程度偏移到極限的時候,就是我們的植物燃燒狀態,用0.9到1來定義。它和四季變化共享一個LUT, 這種方式的好處在于可以實現平滑的燃燒過度,同時不需要增加更多的材質變體。

當然由于算力限制。在手游上,我們所呈現的燒焦僅是一個顏色變黑,我們在PC上為其添加了更多的shading細節以及復雜的分布規則。



在PC平臺為了營造更好的氛圍感和真實度,會按照一定的規則整合彈坑以及燃燒特效等,材質上也會做更多的細節,比如燒掉的葉子,燃燒的火星,這些內容都可以輕易通過材質質量分級進行性能降配,從而保持跨平臺風格和效果的一致性。



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

在空間上,河流和陸地生態是互斥的,所以他們的儲存并不沖突,換個說法大部分植物不會同時生長在水下和陸地上, 所以我們可以合并儲存。

關于河流的全局數據,我們儲存了如下信息,其中RG通道儲存河流velocity的兩個分向量,也就是flow map,B通道儲存了河流的吸收率控制顏色,A通道保存了河流的泡沫區域,這些數據在shader 使用上端手會有些差異。



根據flow map進行多次采樣即可模擬水波流動的感覺,由于周期內波浪是循環重復的,所以循環采樣的次數越多,其流動表現就會更加自然。

對于PC我們對波浪法線進行3次采樣,每層之間的過度通過余弦函數作為權重進行混合,此外還有模擬了更銳利的小型波浪。

對于手游高配,只需要減少一次采樣,每1/2周期進行混合即可;對于性能較低的機型,直接使用簡單的線性周期混合,節省cos指令的負擔。



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



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

同時映射了LUT的alpha通道用來模擬水的渾濁度,這很好理解,水越渾濁 越深的區域,光線穿透率越低,它會更加的不透明,關于半透明這一點其實我們還做了更多的擴展優化,畢竟手機上的算力實在珍貴。



如前面講的一樣,大部分水比較深的地方幾乎傾向于不透明狀態,并且我們目前沒有水下玩法,所以對于標準地形渲染,半透明銜接處,以及幾乎不透明的深水域做了不同程度的性能優化,大大降低了GPU clock的開銷。



關于水面反射,在PC端上用了Screen Space reflection和多個IBL相結合的方式。

在移動端上,因為性能考量,目前則是只有使用IBL,不過為了整體視覺上的相對正確性,人為的去修改IBL。

最后,我們將wetness信息打包到clipmap中,來作為濕潤地形,濕潤巖石,水坑等的輸入。



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

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



同時這些潮濕的區域通過clipmap作為介質儲存后,就可以使得其他內容進行采樣,比如我們的巖石,這讓環境間有了真實互動。



對于植物來說,全局光照對其最終表現影響很大,而其中ao是最重要的表現,對于PC我們應用了SSRTAO 作為全局光照遮蔽,同時從紋理中補充一些細微結構的ao。植物預烘培的頂點ao只會作用在subsurface上用來擬合多次散射的遮蔽效果。

對于手游的植物則僅有頂點ao。對于草來說只需要通過額外的uv就能獲得ao;除了對環境光進行遮蔽以外,在手游上ao還會參與計算假陰影,這對于手機上的植被表現很重要。



無論是頂點還是像素著色的預算面對畫面中大量的植物來說都是非常昂貴的,其中陰影消耗是非常重的一塊。

對于樹來說我們不僅要減少植物插片的數量和頂點,同時繪制陰影時會使用更低級別的lod模型,但是這同時帶來了難以接受的低質量陰影,你可以看到影子精度很低,同時有生硬的邊緣。

將頂點ao作用到直接光shading上來近似陰影,可以獲得更加平滑的暗部過度,同時減少了采樣陰影帶來的負擔

通過對假陰影的調整,也可以近似模擬出植物多次透射的效果,使暗部不會過于發黑。



最終你能看到更穩定,更穩定,更加統一整體的樹冠表現,最重要的是性能方面非常省。

草的像素面積和頂點甚至會比樹更多,所以不會投射影子也不會采樣影子;

我們通過逐instance的隨機和ao混合作為假陰影,這和樹是類似的,稍微復雜點的是fake shadow會根據視距和視線角度進行衰減,遠處和低頭查看草時不會產生生硬的黑色過渡。



此外草同時也不會投射影子,它們數量太多了。

我們在clipmap中烘培了草的位置信息以供地形采樣, 為地形做了額外的直接光和高光遮蔽,這很好的緩解了沒有投影時地形和草的銜接問題。



為了能在各個平臺上都有比較好的性能和效果表現,植被遠景的方案端游和手游有比較大的不同,因此我們準備了3套不同的方案來應對。

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

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

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



首先,讓我們來看看Impostor。我們使用了一種相當常見的技術,這在之前的許多演講和論文中都有提及——它實際上是一種基于mesh card的方法。它的概念非常簡單,從不同角度捕捉卡片,得到最適合的面,然后在模型的剩余部分重復這個過程,直到沒有剩余部分。



我們發現,這種方法對于團簇狀的樹冠有不錯的生成結果。

但是如果一股腦的對所有樹木,或某些種類的整棵樹進行card生成和紋理捕獲,會存在著card的濫用以及紋理的浪費。

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



我們是這么做的:

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

兩者的分開生成的還有一個好處就是,我們可以對其進行不同處理,比如樹冠需要更強調團簇感和體積感,而樹干樹枝則不需要,最后將2者進行合并。

獨立生成這兩部分的另一個優點是我們可以不同地對待它們。例如,樹冠需要更多地強調簇狀和體積,而樹干和樹枝則不需要。最后,我們將這兩部分合并成一個整體。



同時,我們對整棵樹進行了dither temporal AA來得到順滑的過度,通過vertex color存的信息區分,分別對樹冠和樹枝進行了不一樣的調參設置,減輕樹干插片感的同時,保證樹冠有更高的密度。



相比PC的impostor,billboard比較廣泛的應用在性能比較低端的平臺,對性能更加友好。在這里,我們手機平臺,處理所用的植被遠景都用這個方法。

針對不同的樹木外貌特性,我們處理billboard的方法也會不同。我們大致有3種方法來處理:

首先是Single-plane billboard,這是最為常見的billboard方式。我們對于場景中大多比較對稱植被用采用這種辦法,我們會選擇一個比較適合的視角進行捕捉,無論玩家在世界中所處什么樣的位置,billboard總是朝向玩家。



難以避免還有不少植被是非對稱的,如果用Single-plane billboard的話,會導致無數遠處植被視覺跳變的問題。因此對于這類的植被,我們則用了double planes billboard的方法,捕獲外形差異比較大的2個角度,且又相差90度的的紋理。

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



然后,當視角發生變化后用dither來順滑過度2者的切換。

最后,通過根據攝像機機位的距離來動態調整2片面的間距,從而防止遠處觀察的z-fighting問題。



另外一種billboard我們稱之為Titled Plane。

通常這種樹的輪廓是非常傾倒,極為不對稱的。例如椰棗樹。

我們抓取相對最對稱的角度作為紋理原圖,然后在shader中進行操作將其壓倒。



簡單的來說就是,我們區分了樹干和樹冠部分,對樹冠進行偏移,旋轉,甚至扭曲。對于樹干進行彎曲曲率的調整以及起始點的偏移等等。

這是一個非常主觀的操作,力求將造型與實際模型對齊。通過lerp計算,最終在一個面片上還原歪斜樹木的結果。



另外要提的一點是,無論是哪種類型的biiboard,我們在創建之初,對于面片的尺寸做了均一化處理,無論樹木的實際尺寸是怎樣的。

然后我們在shading中進行尺寸的調節來匹配真實性,從而能更好的對其進行合批操作,大大降低渲染性能開銷。



對于遠景山上,以及無法觸及到的樹木森林,我們會做更極致的優化。

這是對于billboard的延展,美術會手動組合各種樹木的billboard,形成成簇。

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

各種不同類型的billboard組合,構成了Assembly card的多樣性,從而組成為DF世界的遠景和非觸達區域的森林。



好的,現在我們來談談我們在程序化方面的實現。關于程序化世界生成,業界已經有許多成熟的解決方案。

我們依然用的是基于houdini的開發流程, Offline生成結果。獲取地形信息,根據特定的生成規律,生成點云,返回到引擎,并且實例化生態數據。由于這種做法比較普遍,我就不多展開了。相反,我將更多地討論我們如何進行跨平臺實現。當然,首先是我們剛才談到的Clipmap。存儲在其中的大部分數據都是由PCG生成和修改的。



在我們的游戲中,幾乎所有的地形和生物群落都是結合在一起的,并且基于配方,我們為藝術家和內容創作者提供了畫筆工具作為預設。預設包括地形、植被資產、貼花和VFX(例如落葉、漂浮的灰塵、煙霧、霧氣等)。藝術家只需選擇相應的預設,在世界中他們想要的地方進行繪制,而無需進行任何額外的步驟或設置。

這使我們能夠在編輯器中使用一套預設工具,但我們的配方是完全解耦的,這意味著同一個配方在每個平臺上都有單獨的HDA文件。最后,我們在PC和移動設備上得到不同的結果,主要是為了應對平臺限制和性能問題。



盡管PC和移動設備是兩個獨立的管線,但由于它們共享相同的生物群落類型,我們仍然希望它們具有相似的外觀。當然,在創建和迭代過程中,我們也不希望做兩次工作。因此,我們尋找兩個版本之間的繼承關系,并在Houdini中進行降級操作。我們的方法是鎖定配方中的高優先級元素,并將其繼承到移動設備版本,同時去掉不太重要的元素,如矮樹、小灌木和裝飾物。這就得到了一個簡化的移動設備版本,總體上保持了相似的外觀。



而且,如果我們仍然存在一些性能熱點,僅減少配方復雜度無法滿足要求,我們還設計和創建了專用的配方,在某些區域更激進地降級密度和類別。你可以將其視為僅限移動設備或移動設備專用的工具,僅影響移動設備版本。



我們盡量使生物群落盡可能基于預設,但為了滿足非常特定的游戲玩法需求,我們也提供了手動放置樹木和大灌木的靈活性。但周圍的裝飾會進入程序化處理。

最后,細節將在周圍生成,并且與整體環境很好地集成。

我們實現了自動修正來處理大塊植被的重疊和交叉。像棕櫚樹總是最好的例子。首先,我們需要找到一種方法來驗證它們是否交叉。因此,我們將幾何體體素化,3D體素相當于具有值1的3D數組。如果多個3D數組的和的最大值等于2或更大,這意味著模型交叉了。接下來,我們自動更改其中一個模型的方向。然后,再次進行驗證和修正。并反復這個過程,直到沒有交叉。這樣,我們在PC和移動設備上都確保了所有樹木都放置得正確美觀。



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

由于一切都由PCG控制,因此我們可以調整密度以減少三角形數量,或者替換某些類型的模型以減少Drawcall,靈活地實現每個質量級別的視覺和性能的最佳平衡。最后,我們得到了在感知上相似的PC和移動設備版本,同時根本上滿足了兩個平臺的質量和性能需求。



最后,道路也是地形的一部分,所以我來展開說一下我們在這方面做出的一些優化。在一些低端移動手機上,由于性能限制,我們無法支持VT(虛擬紋理)。而且,我們的地形精度也從每格1米降低到每格2米。正如你所見,道路和地形幾乎到處可見得重疊,Z-fighting非常嚴重。所以,即使輸入數據相同,每個平臺的處理方法也需要有所不同。



在程序化處理過程中,我們為低端設備生成額外的道路模型,拓撲結構需要更改為2米以精確匹配地形網格。這樣視覺上看起來正確,但這導致了另一個問題,即三角形數量急劇增加,低端設備也無法承受。因此,我們對遠處的道路進行減面來作為LOD模型。為了避免重疊再次出現,此外,在頂點著色器中,我們將遠處的頂點漸進逐漸向上拉。最后看起來一切都很完美。



在下面內容中,我們的引擎程序員組長焦航,將帶大家了解核心技術特性。

分享嘉賓:

焦航 騰訊游戲天美J3工作室引擎組負責人

大家好,我是焦航,來自琳瑯天上的引擎團隊負責人。你們可以叫我Jesse。過去十年,我一直在移動游戲開發領域深耕,參與過《穿越火線手游》《使命召喚手游》等成功項目的開發——這些都是基于Unity引擎實現的。今天,我將以我們使用虛幻引擎4.24開發的《三角洲行動》游戲為例,帶大家揭秘游戲中地形與生態群落渲染背后的技術。



首先,我們來聊聊地形貼圖技術。

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

在移動端使用VT時,我們需要在寫入VT前,對紋理進行運行時壓縮。如果不壓縮,每幀都會消耗大量帶寬,導致設備發熱。因此,我們將其壓縮為ASTC 4 * 4或6 * 6格式。我們采用了極簡算法,僅支持ASTC的雙端點模式,不含ASTC的分區模式。出于兼容性考慮,我們在所有移動設備上使用pixel shader執行壓縮。首先通過pixel shader輸出到uint4紋理,每個像素128位,對應ASTC的block大小。接著將紋理復制到buffer,最后再復制給壓縮紋理。



這是實際效果:帶寬方面,每幀帶寬減少到原先的四分之一或九分之一。PSNR值穩定在40到50區間,美術團隊對最終視覺效果表示認可。單張VT頁面的壓縮耗時僅需0.2毫秒。



接下來聊聊地形貼圖的基礎——splat map。我們在雙平臺使用基本相同的splat map方案,這使移動端也能獲得高品質地形。在移動端,我們將PBR紋理的多個通道打包到更少的貼圖中。具體來說,我們用了兩個texture arrays:一個存儲albedo和heightmap,另一個儲存normal、roughness及ambient occlusion。



來看看先來看看我們的需求:美術想要至少32層材質混合,以提升場景豐富度。這需要某種形式的ID map方案支持。想要實現基于高度的權重混合,且權重可控——這種混合方式能讓兩個材質在大范圍漸變過渡,使交界更自然。這需要地形上每個點需要為每層材質單獨存儲權重值。同時受帶寬限制,紋理采樣次數必須嚴格控制。但,等等,常規的每層權重方案(比如虛幻引擎默認方案)無法支持如此多層,因為每一層貼圖都需要采樣做混合。而ID map方案(如《孤島驚魂》《幽靈行動》采用的方式)又不支持權重混合,每個點只能指定單一材質ID。我們該怎么辦呢?



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



生成ID map的具體流程是:美術師在編輯器中正常為每層材質繪制權重,我們會在每個地形采樣點,篩選出權重最高的兩個材質層保留下來。



接下來,地形上的每個像素需要獲取周圍4個采樣點,并進行插值計算。這意味著每個像素需要采樣4個ID map點,進而采樣8個材質層,在移動端總計產生20次采樣。這樣的開銷顯然過大,必須進行優化。



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



那么我們如何從三角形內的6個ID中提取3個獨立層?我們通過離線ID修復流程實現這一點。當美術師在編輯器中繪制權重時,每個三角形會包含6個層ID:3個底層ID和3個頂層ID。流程開始時,創建一個容量為3的空集合。首先將3個底層ID全部加入集合。若集合未滿(存在重復ID),繼續按權重從高到低的順序逐個添加頂層ID。若集合已滿,則丟棄,具體做法是將多余頂層ID設置為與底層ID相同。



由于只是移除多余ID,處理相鄰三角形時不會破壞當前三角形數據。現在這6個ID中僅保留3個不同的值。還記得我們為材質層設定了明確順序嗎?因此頂層ID始終大于底層ID。接下來需要在shader中從這6個數值中提取3個ID,分別命名為min、mid和max。



在shader中,每個待渲染像素首先需解碼3個ID map采樣點,獲取6個ID編號及3個權重值。隨后通過這段代碼,從6個ID中提取出min、mid和max三個核心ID。



最終,我們能在每個三角形頂點獲取各材質層的權重值,并完成混合計算。相關PPT稍后會上傳至GDC Vault平臺。接下來我將繼續講解。



總結來看:相比傳統的weight-per-layer方案,我們的方法支持更多材質層疊加。相較《孤島驚魂》《幽靈行動》采用的ID map方案,我們實現了權重混合功能。傳統ID map方案要實現過渡效果,必須創建包含兩種材質的混合層,這會額外消耗內存。而我們的方案可以任意兩層材質自由混合,無需占用額外內存。此外,這種混合機制還能實現類似《巫師3:狂獵》的法線疊加與衰減等高級效果。



關于懸崖渲染:在VT方案中,UV通常基于世界坐標的XY軸投影,這會導致懸崖面出現紋理拉伸。常規解決方案是采用tri-planar映射——需要額外增加XZ和YZ軸的紋理投影采樣,并進行混合。但這會導致每幀的額外性能開銷。目前存在tri-planar的優化方案,不過通常仍需在base pass中增加紋理采樣次數。



那么為何不直接將tri-planar映射渲染到VT中呢?讓我具體說明:可以看到XY軸投影,僅在平坦區域表現良好。在懸崖垂直面上,如果繼續使用XY軸投影,UV坐標會產生嚴重拉伸變形。



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



要實現這一點,我們需要引入Z軸坐標。必須將實際地形網格輸入VT生成流程,而非之前的quad。注意要使用SampleGrad方法——由于每個像素的UV動態變化,必須手動指定正確的mipmap層級。這是優化后的效果:可以看到紋理拉伸消失了,但出現了明顯接縫。如何消除接縫?



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



最終我們以極低成本實現了類似Tri-planar的效果。我們也嘗試過bi-planar方案,雖然混合效果更好但性能開銷更大。隨機方案在效果與性能間達到平衡,最終成為游戲內的實裝方案。不過直接在VT中渲染懸崖存在一個限制——當玩家近距離觀察時,最大分辨率會有所下降。我們認為這是一個可接受的取舍。



這里還有另一個提升視覺質量的技巧:使用高度混合時,近處效果良好,但遠景會出現塊狀瑕疵——這是因為遠距離混合使用高LOD層級的mipmap,精度不足導致。除了調整遠景tiling之外,我們還引入了另一個技巧。我們在遠處采用線性混合方案:隨著距離增加,逐步過渡到線性混合模式。這種處理使過渡更柔和,有效解決了塊狀瑕疵。



這里還有另一個運行時出現的問題:美術師在編輯器中精心雕琢的地形細節,在移動端運行時——尤其是遠景中——會顯得過于平坦,溝壑與侵蝕細節被平滑掉了。



根本原因在于:編輯器中地形使用38萬三角面,而運行時版本僅保留8萬面。出于性能考量,我們大幅降低了遠景區域的網格密度。這意味著通過頂點法線(vertex normal)表現的幾何細節也隨之減少。



為恢復這些細節,我們引入Streaming Virtual Textures(流式虛擬紋理)解決方案。既然遠景區域的網格無法存儲足夠頂點法線細節,我們就將其烘焙到紋理中。將整個地形的低層級mipmap烘焙成SVT格式。在VT生成階段,當收到頁面請求時,我們會檢查是否存有SVT數據。若存在,則直接將數據載入physical texture,而非通過RVT方式實時渲染。SVT與RVT共享同一塊physical texture內存,因此不會產生額外內存消耗。



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



此外,游戲中還有許多細節調優案例。例如在這款快節奏FPS游戲中,開鏡時攝像機FOV(視野)會急速變化,導致VT需要立即重繪更高精度內容——這會產生明顯的地形突變(pop-in)現象,干擾玩家索敵。因此我們在開鏡時引入額外偏移值(bias),使FOV變化時維持當前mip level。該方案顯著提升了操作流暢度,代價是開鏡時地形會略顯模糊。



接下來我們將深入探討地形幾何結構。

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



此外,我們還通過一個小技巧進一步降低實例數量。常規情況下,當請求某地形tile的高LOD層級時,會將其細分為四個高LOD子tile,導致需要4個實例渲染。但我們采用頂點著色器裁剪方案:將低LOD網格中需要細分的區域切割出來,僅對該區域進行細分。切割操作通過頂點著色器動態調整頂點位置實現。這使得總實例數降至2個,且每個實例保持相同頂點數,從而減少總頂點繪制量。



關于曲面細分(tessellation)。硬件曲面細分存在許多問題。它存在性能問題,三角形分布模式也不夠理想,可能導致更多誤差。而且在移動端并不適用。因此,我們實現了軟細分方案。這是對CDLOD的自然延伸——通過為地形塊引入LOD -1、-2等級別,從VT中采樣高度圖來調整幾何結構。



關于軟細分方案——我們希望附近的幾何密度非常高,并且密度隨著距離增加而快速降低。但CDLOD要求相鄰地形塊的LOD等級差異只能相差一級。這種限制會導致大量冗余地形塊。正如所見,我們不得不切割出額外地形塊來滿足這個限制。我們放寬了這個限制,允許對LOD進行多次細分,同時保留之前提到的裁剪剔除方法。傳統做法是2x2的細分,而我們嘗試了4x4和8x8的細分方式。通過之前介紹的裁剪技巧,你會發現實例數量更少了,而且網格密度能以此方式更快降低。我們最終選擇4x4方案,因為它在誤差率和實例數量之間取得了最佳平衡。



相比硬件曲面細分,這種方案性能更優、三角形分布模式更優,誤差也更低。我們已經在PC平臺實裝了該方案。理論上在移動端也能落地,但最終沒有足夠時間將其植入正式版本。在中高端機型上值得嘗試。



此外,我們還做了多項性能優化——針對時間和內存進行了優化,更重要的是,針對移動端的發熱問題。

正如Lichuan之前提到的,我們在多個場景中使用了clipmap技術。這種技術的精髓在于——根據相機位置動態加載周邊高精度紋理,遠處則加載低精度貼圖,具體精度范圍取決于你想要保留細節的最遠距離。這能節省大量內存。



我們把splat ID map也改造成了clipmap結構——只有近處才需要高精度數據。在實現上,不再為每個區塊單獨啟用VT renderer,而是通過whole scene VT renderer統一管理clipmap流式加載。這樣減少了Actor數量,卡頓現象也隨之緩解。



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



我們自動監測實際使用的層數,并進行可視化圖層檢查。在興趣點(POIs)之間的過渡區域,內存壓力較低,因此可以適當放寬限制以獲得更佳畫質。



還有一個優化思路值得分享。雖然允許每個像素混合3種不同圖層,但實際很多區塊用不到這么多層——比如大面積單一圖層(草地、泥土)或僅混合兩種圖層的區域占主流。考慮到高頻更新的高精度LOD VT頁會頻繁切換進出physical texture,我們為著色器制作了三種變體,根據即將渲染的VT頁實際使用層數動態選擇著色器變體。這些數據是離線統計生成的,內存開銷極小。



在移動端,我們可以優化VT流程中使用的渲染目標。理想情況下,VT內只需兩張紋理,通過通道合并來降低基礎通道的采樣次數。但由于Decal存在透明度混合,渲染VT頁時仍需將透明度通道單獨保留。之后通過subpass(或frame buffer fetch)對通道進行重組,使其達到理想布局。這種操作利用移動端的on-chip內存,無需回傳到主內存。接著就能進行ASTC格式壓縮。更進一步——如果檢測到某個Tile沒有透明度混合需求,就直接以理想通道布局繪制到渲染目標。這類信息同樣是通過離線烘焙獲取的。



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



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



我們針對不同機型精細調試了所有參數,確保各檔次設備都能流暢運行,同時呈現其硬件允許范圍內的最佳畫質。這是最終各檔次設備上的內存占用情況。



這是部分性能測試數據。

我們對地形渲染性能進行了測試,將本方案與移動端主流的4層逐層權重法進行對比。測試數據均基于驍龍855平臺,且僅渲染地形。可以看到無論是高畫質檔還是低畫質檔,本方案在幀率、功耗、帶寬和GPU耗時上均有優勢。更關鍵的是,我們還能支持32層材質混合以及大量Decal效果。



以下是今日分享的核心結論:在地貌與地形渲染方面,我們通過合理控制復雜度實現了跨PC與移動端的兼容適配;運用程序化生成方法加速迭代并提升品質;針對地形貼圖與幾何結構開創了獨特的解決方案;并通過性能與scaling調優確保方案落地。關于未來方向——我們計劃完善天氣系統的實現方案,開發水下特性,同時加強地形法線混合和衰減的調試以進一步提升視覺表現。



特別感謝所有杰出的同事——你們才是真正的英雄。感謝Delta Force整個團隊。感謝GDC組委會提供這個分享平臺。感謝在座各位的聆聽。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
湖人森林狼首輪賽程公布!5戰有7天休息日遭質疑

湖人森林狼首輪賽程公布!5戰有7天休息日遭質疑

小鞄搞笑解說
2025-04-17 06:14:05
熱搜第一!24歲男演員突然去世,家人稱其患精神疾病,1月份失蹤

熱搜第一!24歲男演員突然去世,家人稱其患精神疾病,1月份失蹤

新晚報
2025-04-17 16:18:49
劉惜君這么美

劉惜君這么美

東方不敗然多多
2025-04-09 00:03:53
尼日爾撕毀4億美元合同驅逐我高管,中方暗藏后手,讓其悔青腸子

尼日爾撕毀4億美元合同驅逐我高管,中方暗藏后手,讓其悔青腸子

睡前講故事
2025-03-27 16:53:53
廣東一大媽用蓮子煲湯喝,1年后去醫院,醫生驚嘆:你干了啥?

廣東一大媽用蓮子煲湯喝,1年后去醫院,醫生驚嘆:你干了啥?

王曉愛體彩
2025-04-12 14:09:57
杜華公開娛樂圈殘酷現狀:王一博半年收入超5億,有藝人6年0工資

杜華公開娛樂圈殘酷現狀:王一博半年收入超5億,有藝人6年0工資

光影新天地
2025-04-16 11:25:32
中央新規!機關單位女干部退休年齡有變:處級63歲?如何申請提前

中央新規!機關單位女干部退休年齡有變:處級63歲?如何申請提前

山藥蛋TV
2025-03-26 11:10:52
所有女人的出軌,其實都是從這樣開始的

所有女人的出軌,其實都是從這樣開始的

加油丁小文
2025-04-07 14:00:04
人民日報發聲!訂婚強奸案落下帷幕,男方母親說法可笑,輿論反轉

人民日報發聲!訂婚強奸案落下帷幕,男方母親說法可笑,輿論反轉

墨印齋
2025-04-17 13:05:30
銀行存款大調整!2025年4月起,存款超50萬的家庭需留意!

銀行存款大調整!2025年4月起,存款超50萬的家庭需留意!

巢客HOME
2025-04-08 20:33:26
加蓬媒體:布彭扎曾感覺不適要看心理醫生,然后就跳樓自殺了

加蓬媒體:布彭扎曾感覺不適要看心理醫生,然后就跳樓自殺了

懂球帝
2025-04-17 11:44:07
“大同訂婚案”二審宣判,男方母親:兒子狀態好,在里面不受歧視

“大同訂婚案”二審宣判,男方母親:兒子狀態好,在里面不受歧視

漢史趣聞
2025-04-16 11:18:13
明晚央視首播!12集刑偵懸疑劇來襲,就沖這2點,我敢斷言:能火

明晚央視首播!12集刑偵懸疑劇來襲,就沖這2點,我敢斷言:能火

新語愛八卦
2025-04-17 16:08:32
小S與吳宗憲的女兒吳姍儒撕破臉,與S家接觸的為什么都會被針對?

小S與吳宗憲的女兒吳姍儒撕破臉,與S家接觸的為什么都會被針對?

每日娛樂鮮報
2025-04-17 06:46:38
沒了!安切洛蒂,確定下課!

沒了!安切洛蒂,確定下課!

足球大號
2025-04-17 10:54:55
關稅壓力下 臺積電亞利桑那工廠訂單不斷 4nm制程價格將上調30%

關稅壓力下 臺積電亞利桑那工廠訂單不斷 4nm制程價格將上調30%

cnBeta.COM
2025-04-16 19:43:18
朱西產:3年內蔚小理一家不剩,存活率為0

朱西產:3年內蔚小理一家不剩,存活率為0

創作者_1470992743975
2025-04-15 17:11:20
陽光透過窗簾我站在衣柜前,指尖輕輕劃過掛著的淺藍色牛仔褲

陽光透過窗簾我站在衣柜前,指尖輕輕劃過掛著的淺藍色牛仔褲

木沐中視頻
2025-04-17 00:20:41
三河回應“警徽改色”:適配墻體

三河回應“警徽改色”:適配墻體

大象新聞
2025-04-16 10:46:03
政策有變,多家銀行上調!

政策有變,多家銀行上調!

魯中晨報
2025-04-17 08:59:01
2025-04-17 16:59:00
GameRes游資網 incentive-icons
GameRes游資網
GameRes游資網
6838文章數 10434關注度
往期回顧 全部

游戲要聞

花100萬做戒指沒成功,黃金服老板破防:再充200萬!

頭條要聞

黃仁勛時隔3個月再次到訪北京:希望繼續與中國合作

頭條要聞

黃仁勛時隔3個月再次到訪北京:希望繼續與中國合作

體育要聞

結束16年等待,一支強硬的阿森納向我們走來

娛樂要聞

張檬順利產子,韓國婆婆趕赴香港陪產

財經要聞

是否與美方展開溝通?商務部回應

科技要聞

余承東大講安全,絕口不提智駕"替你開車"

汽車要聞

一躍跳過障礙/秒切防御姿態 看懂嵐圖"開掛"絕技

態度原創

房產
家居
健康
公開課
軍事航空

房產要聞

最后一波!15萬起上車海口超級大盤,還是準現房!

家居要聞

現代極簡 舒適與美觀并存

唇皰疹和口腔潰瘍是"同伙"嗎?

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

朝鮮譴責美國派遣戰略轟炸機至朝鮮半島

無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 楚雄市| 灵川县| 秦安县| 库尔勒市| 阜宁县| 卢氏县| 荔波县| 卢龙县| 清丰县| 渝中区| 咸阳市| 苗栗市| 呼伦贝尔市| 平乡县| 阿勒泰市| 黎城县| 阳泉市| 河曲县| 米林县| 塘沽区| 离岛区| 西宁市| 江口县| 周至县| 文登市| 兴化市| 新巴尔虎左旗| 武隆县| 太康县| 凤阳县| 忻州市| 东城区| 遵义市| 景德镇市| 莱州市| 阿拉善右旗| 汪清县| 大方县| 讷河市| 宁明县| 磐石市|