導(dǎo)語:在今年的游戲開發(fā)者大會(GDC 2025)上,騰訊游戲帶來20場議題分享,圍繞AI、渲染、跨端游戲開發(fā)等游戲技術(shù)應(yīng)用及游戲研發(fā)經(jīng)驗與全球游戲開發(fā)者探討交流,引發(fā)同業(yè)關(guān)注。此外,騰訊海外工作室拳頭、Supercell、Digital Extremes等也帶來了超40場分享。本文為“程序化生成之路:重建秦朝古都”分享的圖文版干貨內(nèi)容。
分享嘉賓:
陳宇青 騰訊游戲天美工作室T1技術(shù)美術(shù)
余果 騰訊游戲效能產(chǎn)品部技術(shù)美術(shù)
大家好,歡迎來到我們今天的分享會。我叫陳宇青,很高興和我的同事余果一起和大家交流我們?nèi)ツ曜龅囊粋€項目。這個項目是關(guān)于如何通過程序化方法構(gòu)建一座城市。先簡單介紹一下我自己,我于2020年加入騰訊,最近5年一直負(fù)責(zé)開發(fā)程序化內(nèi)容生成(PCG)相關(guān)的工具集。在深入主題之前,我想先播放一段關(guān)于這個項目的視頻。
我們將主要討論四個話題。首先是項目背景,我們之前做過什么,以及我們?yōu)槭裁匆獦?gòu)建這樣一個演示項目。第二部分是我們的工具集架構(gòu),我們想要實現(xiàn)的一些目標(biāo),以及我們做出的一些設(shè)計選擇。第三部分是實現(xiàn)細(xì)節(jié),包括布局、建筑和興趣點區(qū)域。最后一部分是總結(jié)。
這是預(yù)告片的一個片段。我想展示一下我們之前做的一些自然環(huán)境方面的工作。如大家所見,過去幾年我們一直在構(gòu)建一款開放世界類型的手機游戲。我們的目標(biāo)是擁有64平方公里的可玩區(qū)域。其中64%的世界將是自然環(huán)境。接近40%將是像小鎮(zhèn)和大都市這樣的以人類活動為中心的環(huán)境。
左邊的圖片是我們之前完成的一座中型城市。我們采用的是人工密集型工作流程完成的,包含約2萬棟建筑。我們花了21個人月來構(gòu)建它,每次迭代需要2個人月。我們想要構(gòu)建一座像右邊圖片那樣的大都市,其規(guī)模是當(dāng)前城市的16倍。如果采用舊方法,預(yù)計需要336個人月,基本上這是不可能完成的任務(wù)。那么我們應(yīng)該怎么做呢?
帶著這些問題,我們尋找了一些行業(yè)解決方案來幫助我們。育碧之前發(fā)布了一系列關(guān)于程序化生成的演講,還有幾款基于Houdini的解決方案在自然環(huán)境方面非常出色。
我們從中學(xué)到了很多,并且已經(jīng)建立了一個構(gòu)建自然環(huán)境的流程。正如您所看到的這些圖片,它們是我們正在構(gòu)建的世界的不同地點。但以人類活動為中心的環(huán)境仍然是個問題。
我們在尋找一些程序化城市解決方案,我們回顧了蜘蛛俠系列和《黑客帝國覺醒》技術(shù)演示。它們給了我們很多啟發(fā)。
但關(guān)鍵在于,我們想要創(chuàng)建一座以中國古代為基礎(chǔ)的城市,特別是秦朝(大約2600年前)。
這里有一些關(guān)于這座城市的參考,如您所見,它們的布局更加不規(guī)則。由于現(xiàn)代城市通常建立在大面積的平坦區(qū)域上,秦朝的城市通常圍繞山脈建造,并且在垂直方向上有多個層次的結(jié)構(gòu)。
所以我們意識到我們必須自己構(gòu)建一個解決方案。這就是我們想要構(gòu)建古代城市項目的原因。
現(xiàn)在讓我們回顧一下在這個項目中我們需要實現(xiàn)的一些目標(biāo)。
第一個目標(biāo)是構(gòu)建一個以藝術(shù)家為導(dǎo)向的工作流程。我們的藝術(shù)家將遵循四個不同質(zhì)量階段來制作高質(zhì)量的場景,我們需要在PCG工作流程中尊重這一點。并且我們希望我們的藝術(shù)家在虛幻引擎內(nèi)創(chuàng)建程序化內(nèi)容,而無需打開其他應(yīng)用程序。
第二個目標(biāo)是遵循中國古代城市的布局設(shè)計。我們需要提供一些工具來幫助他們原型化城市的布局,就像左邊圖片展示的那樣。同時,工具生成的內(nèi)容也應(yīng)該符合這些要求。我們對程序化元素的值和位置有一些限制。例如,我們不能有一個太窄的隧道或建筑物和墻壁之間太小的間隙。以符合游戲玩法設(shè)計。
第三個目標(biāo)是提高生產(chǎn)效率。因為我們有手動完成這項工作的慘痛經(jīng)歷。
接下來談?wù)勎覀儗Υ说幕卮稹N覀儤?gòu)建了一個包含三個步驟的工具集。
第一步是為手動放置設(shè)計的。我們允許藝術(shù)家放置自定義的立方體和曲線,以代表主題區(qū)域和道路,從而快速原型化城市的關(guān)卡設(shè)計。
第二步基本上是一個交互式的PCG過程。我們將在藝術(shù)家在第一步放置的區(qū)域內(nèi)程序化地生成更多的子盒子,以代表建筑物和多個PCG目標(biāo)。藝術(shù)家可以調(diào)整盒子的位置、大小。并將它們發(fā)送去處理,來回調(diào)整PCG結(jié)果。
第三步,在每個庭院內(nèi)生成更高質(zhì)量的資源和裝飾性內(nèi)容,這部分的結(jié)果應(yīng)符合交付質(zhì)量。
另外一點是,我們通過兩種自定義編輯模式擴(kuò)展了虛幻引擎,即古代城市編輯模式和興趣點(POI)編輯模式,這將允許藝術(shù)家直接在虛幻引擎內(nèi)創(chuàng)建與PCG相關(guān)的所有內(nèi)容。
在虛幻引擎和后端Houdini之間通過PCG服務(wù)進(jìn)行數(shù)據(jù)傳輸。正如您所看到的,左邊的圖片是我們在虛幻引擎中的一個城市關(guān)卡,右邊的是在Houdini中的傳輸代理數(shù)據(jù),我們將把處理好的數(shù)據(jù)送回虛幻引擎以完成一個計算循環(huán)。
為了實現(xiàn)第二個目標(biāo),即尊重中國古代城市的布局要求。我們回顧了中國不同朝代的城市特征,我們發(fā)現(xiàn)每個朝代都有其獨特的風(fēng)格,像秦朝的閭里制和宋朝的街巷制。我們還調(diào)查了不同區(qū)域的布局規(guī)則,像居住庭院、花園、宮殿和傳統(tǒng)寺廟,我們將在工具開發(fā)過程中尊重這種獨特性。
對于我們第三個目標(biāo),效率提升部分,我們希望我們的關(guān)卡藝術(shù)家專注于POI區(qū)域,這些區(qū)域可能包含大量的游戲玩法設(shè)計。
因為城市80%的部分將是PCG部分(圖片中的藍(lán)色區(qū)域),而另外20%是POI區(qū)域,我們?yōu)檫@部分設(shè)計了特定的工具。
為了實現(xiàn)第三個目標(biāo),即效率部分。我們開發(fā)了分布式處理方法來加速我們的布局進(jìn)度。多個區(qū)域可以同時處理,藝術(shù)家可以以高頻率獲得反饋。
對于一個單獨的地塊,我們可以通過參數(shù)控制生成多種結(jié)果,讓藝術(shù)家挑選其中更好的一個。
此外,我們的PCG結(jié)果可以由藝術(shù)家手動修改,以決定該區(qū)域的最終外觀。
我們整個框架由兩部分組成。圖片左側(cè)的虛幻引擎界面和右側(cè)的PCG后端,PCG服務(wù)將在它們之間進(jìn)行數(shù)據(jù)傳輸。引擎界面旨在處理來自藝術(shù)家的數(shù)據(jù)輸入,如繪制區(qū)域和立方體,接收來自PCG后端的數(shù)據(jù)。后端本身負(fù)責(zé)程序化相關(guān)的計算。
引擎界面將允許藝術(shù)家繪制區(qū)域和道路以原型化關(guān)卡設(shè)計。道路如果與輸入?yún)^(qū)域重疊,將把它們分成子區(qū)域。就像這張圖片中的紅色和黃色框,這些子區(qū)域?qū)⑹呛罄m(xù)處理的基礎(chǔ)。
PCG后端將從引擎接收區(qū)域數(shù)據(jù),并根據(jù)我們之前提到的規(guī)則,如閭里制,遞歸且分層地運行計算。以匹配秦朝的風(fēng)格。并且詳細(xì)內(nèi)容,如建筑物、內(nèi)部道路、NPC和裝飾性內(nèi)容也將在該步驟中生成。
對于POI區(qū)域,藝術(shù)家可以使用我們的POI工具集快速創(chuàng)建多種元素,如繩索、標(biāo)志、雜物、城墻或城市外的稻田。
接下來由我同事余果來解釋PCG后端部分。
首先,它利用USD進(jìn)行標(biāo)準(zhǔn)化。這不僅允許與行業(yè)中的其他數(shù)字內(nèi)容創(chuàng)作工具無縫集成,還賦予了我們前所未有的表達(dá)能力。
其次,它是一個基于Omniverse構(gòu)建的云服務(wù)。這使我們能夠更輕松地與團(tuán)隊成員合作,并在需要時擴(kuò)展計算資源。
第三,它采用Houdini進(jìn)行布局算法。Houdini仍然是程序化內(nèi)容生成最強大的工具,并且它與Flow在云端配合得非常好。
最后,它利用分布式并行計算,使我們能夠快速高效地生成大規(guī)模內(nèi)容。
此外,它與UE5中的新PCG圖集成了良好的配合,這一點我差點忘了提及。希望這能回答“為什么還要使用另一個PCG框架?”這個潛在問題。
另外,它已經(jīng)被無數(shù)電影作品測試和證明。
USD,憑借其能力,已在業(yè)內(nèi)廣泛采用。除了在業(yè)內(nèi)的廣泛采用,我們還非常重視USD的高性能和高擴(kuò)展性。
由于USD被設(shè)計為快速且高效,它可以輕松處理大規(guī)模內(nèi)容。USD具有將修改后的內(nèi)容保存在單獨文件中的能力,這就像一個補丁,這種補丁般的行為進(jìn)一步降低了通信成本,并與Flow框架完美結(jié)合。
眾所周知,USD誕生于皮克斯,為電影行業(yè)服務(wù),許多功能都是圍繞他們的需求開發(fā)的。另一方面,我們是游戲開發(fā)者,USD在某些方面尚未覆蓋,例如在虛幻引擎中,我們有地形、植被、藍(lán)圖等。
幸運的是,USD極其靈活。我們可以傳遞任意數(shù)量的屬性,可以定義自己的語義,并且可以表達(dá)資產(chǎn)、組件、Actor及其屬性間的復(fù)雜關(guān)系。這對于設(shè)置虛幻場景至關(guān)重要。
憑借這些特性,我們現(xiàn)在可以用USD表示一個完整的虛幻場景。通過這種方式,通過USD,我們可以在Houdini中完全控制虛幻場景。
在這個例子中,我們在一個屬性中放入了一大塊文本數(shù)據(jù),這樣可以確保生成的虛幻Actor在虛幻中可重新編輯,這個屬性有時可能高達(dá)數(shù)十MB。
這當(dāng)然不是USD原本的設(shè)計用法,但它可以毫無問題地處理這種用法。而且,用其他格式很難實現(xiàn)這個功能。
讓我們來談?wù)勗谠贫诉\行Houdini的好處。實際上,這是我們構(gòu)建Flow框架的最初動機。
最后,分布式計算。這是我們?yōu)楣糯鞘许椖繕?gòu)建的,并且極大地提升了性能。現(xiàn)在有了我們現(xiàn)有的工具,這已經(jīng)變得很容易了。
布局算法本質(zhì)上是可并行化的,因為每個區(qū)域可以獨立計算。這使它們成為分布式計算的理想候選者。隨著Houdini實例已經(jīng)在云端運行,USD文件已經(jīng)存儲在云端,這只是調(diào)度任務(wù)和收集結(jié)果的問題。
在這張圖片中,一個用戶提交了一個任務(wù),許多工作進(jìn)程同時處理它。但由于我在用戶名上打了馬賽克,可能看起來不太清楚。
無論如何,憑借這個框架,大型城市可以在幾分鐘內(nèi)生成,陳宇青稍后會列出具體數(shù)字,現(xiàn)在我覺得是我把時間交還給陳宇青的時候了,多謝。
好的,多謝我的同事,歡迎回到我的頻道。這部分是關(guān)于我們?nèi)绾螌崿F(xiàn)不同區(qū)域的布局設(shè)計的。
我們的城市布局可以分為兩種類型,定居點型建筑,如平民區(qū)和富人區(qū),還有像政府大樓和皇帝宮殿這樣的大型建筑。
我想再詳細(xì)解釋一下我們的布局規(guī)則閭里制。
秦朝在當(dāng)時是一個軍事化的國家,所以政府用非常嚴(yán)格的法律來統(tǒng)治人民,居住區(qū)的布局也是這種統(tǒng)治的反映。所以有一句來自我們古籍《周禮》的諺語,它說五戶為一比,五比為一閭,所以這個規(guī)則被稱為閭里制。
閭里制的布局更像是一個棋盤,從這些圖片中可以看出,尤其是右上角和左下角的圖片,它就像一個網(wǎng)格空間。為了獲得更好的視覺效果,我們在原始的閭里制基礎(chǔ)上添加了尺寸變化。以打破這種高度重復(fù)的韻律。
以平民區(qū)為例,我們的技術(shù)美工在Houdini中開發(fā)了算法,以遞歸的方式劃分和生成布局。
我們將有一個輸入?yún)^(qū)域塊,這是藝術(shù)家在虛幻引擎中創(chuàng)建的。這個塊將被劃分為幾個閭里單位,一些內(nèi)部道路數(shù)據(jù)也會生成。每個閭里單位將在第三步被再次劃分為幾個小庭院,在第四步根據(jù)之前的結(jié)果生成建筑物和墻壁,第五步生成更多的裝飾性內(nèi)容,如生物群落區(qū)域和NPC。
最后我們將這些數(shù)據(jù)讀回虛幻引擎。第六步
還有一個第三人稱視角查看。
富人區(qū)的開發(fā)遵循相同的邏輯,但具有更多的空間和更整潔的布局。
你可以看到第五步的圖片。
對于政府大樓,重點在于它將占據(jù)更大的空間,并且在建筑規(guī)模上具有更高的對比度。
它總是會有一個主庭院和一個大建筑在里面。
所以我們的技術(shù)美工將輸入?yún)^(qū)域塊劃分為至少一個帶有英雄建筑的主庭院。
在我們?yōu)檫@部分開發(fā)的算法中,我們總是通過動態(tài)規(guī)劃算法找到輸入?yún)^(qū)域的最大內(nèi)接觸矩形,無論藝術(shù)家輸入的形狀如何,工具將始終確保有足夠區(qū)域來放置我們的英雄建筑。其他子區(qū)域遵循之前的相同邏輯。
你可以在第五步看到最終結(jié)果。
為了使政府區(qū)域的布局多樣化,我們開發(fā)了一種稱為共線編輯模式的特定編輯方法。
由于我們的布局總是由Houdini生成,藝術(shù)家在處理之前無法看到結(jié)果。
這個功能將在Houdini的第一次處理時創(chuàng)建操作器。并允許藝術(shù)家根據(jù)視覺結(jié)果進(jìn)行修改,而無需依賴Houdini。我們的藝術(shù)家可以避免輸入?yún)?shù)并反復(fù)嘗試。
從視頻中可以看到,我們通過拖動布局邊界輕松調(diào)整了一個政府區(qū)域的布局。
這種共線編輯模式是一種基于幾何算法的操作,靈感來源于室內(nèi)設(shè)計理念。當(dāng)藝術(shù)家拖動布局邊緣時,會觸發(fā)拆分或吸附行為,以幫助藝術(shù)家重新定義現(xiàn)有布局。
我們用這個功能來構(gòu)建秦朝的皇宮。
第一步我們編輯一個由Houdini生成的現(xiàn)有布局,然后將結(jié)果發(fā)送到后續(xù)的第二步、第三步和第四步。第五步是最終結(jié)果。
如果你還記得,我們?nèi)匀恍枰谕ピ簝?nèi)生成詳細(xì)內(nèi)容,主要有四個主要類別需要生成。建筑物、內(nèi)部道路、NPC和一些裝飾,如內(nèi)部花園。
庭院的建筑設(shè)施也可以有多種類型,如主建筑、副建筑、后院建筑和墻壁。它們各自有不同的要求,我將在后面建筑編輯器部分詳細(xì)講解。
對于像內(nèi)部花園這樣的裝飾性內(nèi)容。我們設(shè)計了一種特殊的方法,結(jié)合虛幻PCG框架與Houdini計算。
例如,一個花園將根據(jù)不同的區(qū)域進(jìn)行變化,如富人區(qū)或平民區(qū),有些部分需要藝術(shù)家預(yù)先定義,比如這個區(qū)域可以使用什么樣的樹。但花園的輪廓和生物群落位置可以隨機變化。
所以我們有一個稱為本地PCG的過程。藝術(shù)家可以在虛幻引擎中原型化花園預(yù)設(shè)的外觀。就像左邊視頻顯示的那樣。藝術(shù)家正在使用基于虛幻PCG框架的工具編輯這個預(yù)設(shè)。
我們將這個預(yù)設(shè)及其名稱、權(quán)重和一些重要參數(shù)(如是否啟用樹木生成)一起傳遞。讓Houdini后端來決定分布過程。
當(dāng)我們把數(shù)據(jù)讀回虛幻時,有一個根據(jù)Houdini的輸出實例化我們預(yù)設(shè)的過程。正如圖片所示,一個政府區(qū)域內(nèi)的花園被生成。
通過這種方式,我們的藝術(shù)家可以直觀地原型化PCG元素,并且這部分的關(guān)鍵外觀得到保證。同時,我們避免了大量點云數(shù)據(jù)的輸入和輸出。
對于道路和NPC,我們也使用了這種方法。
為了更高效地組織模塊并重復(fù)使用它們。我們創(chuàng)建了兩個新概念。
1. 建筑模塊,它由一個單一模塊資產(chǎn)和一個單一語法規(guī)則組成。就像圖片的中間列。這個建筑模塊可以導(dǎo)入和導(dǎo)出以供重復(fù)使用。我們不需要每次都從頭創(chuàng)建規(guī)則
2. 建筑模板,它由幾個有序的建筑模塊組成,它可以附加到一個建筑塊上,用于形成更大的建筑。
我們還開發(fā)了一個稱為布局融合的功能,它包含兩個操作,合并和切割。
這將幫助藝術(shù)家處理類似布爾操作的任務(wù)。
有些建筑可能需要部分調(diào)整大小。這里有一個錨點系統(tǒng)。
這是一個三維錨點系統(tǒng)。我們用這些錨點來控制哪部分需要固定,哪部分可以調(diào)整大小。
我們還為藝術(shù)家提供了程序化生成功能。他們可以快速通過幾次點擊彈出不同的建筑。
在我們的城市中,有許多具有獨特特征的興趣點區(qū)域。它非常依賴藝術(shù)家的手動放置,也很耗時。簡單說幾句。
所以我們設(shè)計了一套POI工具來增強場景的多樣性并提高該區(qū)域的游戲玩法設(shè)計。
這張圖片是我們創(chuàng)建的一個POI區(qū)域。通過結(jié)合使用我們的POI工具。
關(guān)于這些工具的框架設(shè)計,我們設(shè)計了一個虛幻C++基類來封裝基本工具行為,如初始化或退出過程,和一個交付類來處理鼠標(biāo)交互邏輯,如點擊和拖動。
線基類繼承自鼠標(biāo)交互類,用于處理曲線形狀的創(chuàng)建和編輯。我們有一系列工具繼承自該類,如路徑對齊分布工具、河流生成工具或城墻生成工具。
每個工具將生成一個新類,稱為生物群落代理,就像右邊圖片顯示的那樣。這是我們生成PCG內(nèi)容的區(qū)域。
對于生物群落代理,我們使用藍(lán)圖系統(tǒng)來擴(kuò)展它,并在幕后使用虛幻PCG系統(tǒng)。由于我們的工具基于虛幻PCG框架,我們的技術(shù)美工可以輕松將其擴(kuò)展為不同的POI工具。讓我們快速看一下這些工具。
曲線散射工具我們用這個工具在建筑前放置一些馬車。這是最常用的工具之一。
標(biāo)志工具。我們通過識別建筑的結(jié)構(gòu)框在建筑表面創(chuàng)建標(biāo)志。
我們用NPC工具創(chuàng)建行人。
我們用城墻工具創(chuàng)建城墻,并通過拖動墻段而不是樣條點來調(diào)整它,這對藝術(shù)家來說非常方便。它可以適應(yīng)地形變化,并可以在城墻模塊之間插入建筑。
我們在城市外創(chuàng)建稻田。該工具支持不同的模式,如曲線形狀和直線。還可以在稻田中生成農(nóng)民和一些設(shè)施。
正如我們之前提到的,用手工方法構(gòu)建這樣的城市需要336個人月才能完成,每次迭代需要32個人月。通過使用我們的古代城市工具集,我們將成本降低到9個人月完成,0.5個人月迭代。對于未來,我們認(rèn)為虛幻PCG框架可以在游戲開發(fā)中扮演重要角色。
最后。我想感謝我的古代城市團(tuán)隊,過去一年我們一直在努力工作,終于完成了這個項目。很高興成為這個團(tuán)隊的一員。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
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.