《黑神話》是如何開發的?3D遊戲技術介紹 | 袁嵐峯_風聞
风云之声-风云之声官方账号-33分钟前
各位天命人,《黑神話·悟空》通關了嗎?打遊戲也可以學知識,我的朋友、風雲學會會員陳經是一位人工智能研究者,這剛好是他的研究領域。他寫了一篇長文《《黑神話》是如何開發的?3D遊戲技術介紹 | 陳經》,下面我來向大家介紹一下。理解了本文,以後看遊戲的眼光,就不一樣了。
一.3D遊戲開發常識
《黑神話》等動作遊戲,全都是3D遊戲。可以理解為有一個虛擬的遊戲世界,其內部是三維的座標系統,遊戲中的物體都在裏面活動。
玩家即時看見的只是遊戲世界的很小一部分,隨着玩家的行走、轉身在不停遊動變換。這個世界叫“攝像機視角”,它也是3D的。
為了把畫面顯示在電腦、手機、平板、遊戲機等設備上,需要將攝像機視角的3D圖景,轉換成2D的畫面。

2D屏幕顯示、3D攝像機視角、整個虛擬遊戲世界
遊戲是動態的,玩家希望看見畫面流暢像放電影一樣,越真實越好。這需要一個雙緩衝區機制。
我們屏幕上顯示的東西,是由顯卡處理的(GPU以前就是顯卡,後來增加了計算功能)。一幅2D圖像內容放入“顯存”,然後用一個顯卡硬件調用,就會在屏幕上顯示出來,呈現的畫面叫“一幀”。如果更新畫面時,對這一幀從上到下逐行掃描更新,就會出現上下不匹配的感覺。實際操作中,會準備顯存中的另一個緩衝區,大小一樣,在其中計算寫入“下一幀”的圖像數據。等全部準備好了,就將屏幕圖像硬件調用的指針指過來,一下全部更新到屏幕上。原來的那幀,就成為計算再下一幀的圖像緩衝區。如此來回切換,屏幕畫面就像放電影一樣推進了。
實踐中,一秒鐘顯示切換30幀的“幀率”,人眼就感覺較為流暢了。幀率比30低,就會有卡頓感。30的幀率繼續提升,人眼會感覺畫面更為流暢普通人到60幀達到滿意的程度,不需要更高了。有些遊戲發燒友會追求120幀,其實區別沒多大。再往上,只有對畫面極為敏感的職業電競選手有追求了。
因此,遊戲顯示幀率一般是在30-60幀,以60幀為優化目標,30幀為優化底線。偶爾出現低於30幀還能忍,經常出現就有問題了。另外,一秒內幀率波動也不好,這叫做“掉幀”,例如300毫秒裏只有3幀,餘下700毫秒27幀。有時Switch等遊戲硬件上的30幀比電腦上的60幀感覺還流暢,這是因為幀率穩定,掉幀少。
以上是最基礎的知識,遊戲畫面是從哪來的。但對於遊戲世界如何構建,還需要更多的知識介紹。
虛擬的遊戲世界,是用“數據結構”來存儲的。開發者總結出了幾類有特性的數據結構:天空盒、地形、植被、水體、粒子特效、場景物品、角色、布料、光源。遊戲世界就是由這些東西構成的,每一類都有自己的特色,相關的數據結構和處理算法都需要專門設計。
天空盒(或者天空球),可以理解為,用一個很大的方形盒子或者球形,籠罩住整個3D世界,盒子上會貼上天空圖片。有些天空算法能讓天空圖片動態變化,效果更自然。這個盒子非常大、非常高,玩家在地面移動時,會感覺天空是穩定的。但要注意,它並不是真有一個很大的盒子數據結構,後面説渲染的時候我們再解釋下。
地形就是地圖,還記錄了地表的高低起伏,是遊戲世界最基礎的數據。植被是地表的草、樹等覆蓋物,量非常大,不斷重複,但又要體現變化。水體有特殊的運動規律,有透明、反射、波動等屬性。粒子特效實現煙霧、火焰、揚沙、揚塵、攻擊波等效果。場景物品定義了遊戲世界的活動空間,包括建築、石頭、土壤、道具等各類剛性物體,有的遠觀,有的能進去,要有更詳細的三維建模。其實植被也可以當物品來理解。但它的數量非常多,需要不同的高效處理算法,就專門定義成一個類別。
角色,是玩家主要的關注焦點。角色的屬性最為複雜,需要更詳細的定義,3D動作遊戲中,不少角色有漂亮的專屬動作。定義角色,一個重要的手段是骨胳關節系統。關節可以扭動,角色就可以變成各種各樣的形態。
角色還會有衣服、飾品、面具等等,有時還有幾層衣服。這些也需要專門的數據結構來處理,布料就能用來表示衣服。
最特殊的一類東西是光源。有火炬、蠟燭之類的光源,有時還有一個外來光源,像太陽一樣的平行光。由於光會反射、折射、吸收、增強,光線的處理非常複雜,是圖形顯示算力需求最大的算法。實際上所有物體的顏色、亮度值都是以光源為基礎的。
好,現學現用一下,大家看看這幅圖中,有哪些數據結構?

看看圖中有哪些數據結構?
每一種數據結構的處理,都有非常深入的計算機圖形學研究背景。靠這些圖形學算法,3D遊戲開發才有基礎。上世紀九十年代,3D遊戲就有了不錯的效果。隨着軟硬件進步,到現在遊戲的效果提升極大,有時逼真得嚇人。瞭解遊戲開發的基礎知識,就會明白遊戲對於科技進步的拉動作用。
3D遊戲開發涉及的數據種類、算法,實在是太多了。一般開發者沒有能力自己去從頭實現,中小公司都不行。還好有遊戲開發引擎,如Unity和Unreal。遊戲開發引擎將相關數據結構和算法打包好,直接提供框架給遊戲開發者使用。開發者按照引擎使用規範,定義好遊戲世界的數據,設定遊戲規則,就可以把遊戲編寫出來了。Unreal和Unity就像編程中常用的Visual Studio一樣,是一個集成開發環境。
Unity是最常用的遊戲開發引擎,開發的遊戲類型和數量最多。除了遊戲以外,它還可以用於美術、建築、汽車設計、影視等領域,都是3D模型、3D世界進行2D顯示。這個引擎的開發公司是Unity Software,中國子公司是Unity中國。Unity中文版叫“團結引擎”,有自己的特性,和英文版不一樣。Unity每年都會有大版本更新,如2019版、2020版,直到2024版,小版本更新就更為頻繁。
Unreal的中文名叫“虛幻”,但沒有特殊的中文版。現在流行的是虛幻4(或稱UE4,2014年發佈)以及虛幻5(或稱UE5,2020年發佈)。《黑神話》就是用虛幻5開發的。Unreal引擎的開發者是著名遊戲公司EPIC,這個公司有《堡壘之夜》、《戰爭機器》等作品。為了促進行業發展,EPIC把Unreal的源代碼開放了,但不是開源,使用還是要付費。和Unity一樣,Unreal也可以用於影視等其它領域。
Unreal相比Unity,率先實現了一些先進圖形算法。其中有些在《黑神話》中有應用,如Nanite、Lumen,後文介紹。不過Unity以後也會實現這些算法。Unreal還有一套定義遊戲規則、角色動作的代碼框架,叫做game play,而Unity沒有。但這並不是説Unreal就更好,也許開發者認為game play定義規則的辦法對某些遊戲並不高效。
個人開發者與中小公司,一般會用Unity或Unreal引擎開發遊戲。大公司也會用,但是大公司同時會有自己開發的引擎,代表公司技術實力。
此外還有DCC軟件(即Digital Content Creation,數字內容生成)、建模軟件,如Blender、3DMAX、Maya,用來生成行業最通用的FBX模型文件。
以上是遊戲開發概念性的常識,沒有涉及具體的數據結構與算法。
二.遊戲開發基礎算法概念
對遊戲世界的物體,基礎的表示辦法是三角形網格(Mesh)。

如圖,用三角形網格模擬物體表面,就可以定義一個物體的三維形狀。頂點的密度越大,三角形網格越多,物體表面就能模擬得越好。三角形網格表示的基礎是,任意多邊形都可以切成多個三角形。也有其它的網格類型,如四角形網格(加一些三角形網格),但最常用的是三角形網格,《黑神話》應該也是。
一個三角形網格,要存儲頂點的3D座標和三條邊,頂點的順序可以區分正面與反面。還有一些其它性質,如法向量、材質屬性。
玩家看遊戲畫面時,往往意識不到三角形網格的存在。這是因為,最吸引注意的,是物體表面(即三角形內部)的“內容”,而不是頂點。要用各種色彩去填充表面,不能是光光的三角形。這就是三角形內部的“紋理”(Texture),其實就是一張圖片貼到三角形上面去。顯示時不止貼圖片,還要結合光源計算出裏面的色彩。
有了三角形網格表示、紋理表面貼圖,一個物體就很像回事了。遊戲中有近景、遠景,對同一個物體可以設計精度不同的模型,近景用高精度,遠景用低精度,分幾個級別。但這都是靜態的,遊戲裏很多物體的形狀、角度是會變的。
物體如何變動、對撞反應,需要一個“物理引擎”。遊戲世界的物理,和真實世界一般是不同的,有誇張、簡化。也有儘量模擬真實世界的,做得很細,這是很難的,主打真實,但效果未必好。遊戲世界只要效果好,完全可以變通處理。一些物理效果顯然是不符合牛頓定律的,——經常在評論區見到有人説:我們這兒不歸牛頓管!但沒關係,人們很容易接受遊戲世界的物理規則,比真實世界更有趣、好玩。
對計算機編程來説,這提供了很大的方便。例如《黑神話》裏,悟空的棍風掃到了幾株小草。如果是真實物理,棍子一掃不可能有太大棍風。在物理引擎裏,就可以簡單處理,對小草加一個有方向的擾動,根據擾動力度,計算各頂點偏移量,模擬出誇張效果。

物理引擎是遊戲引擎裏不算難的部分,遊戲開發引擎會帶上。英偉達就提供了物理引擎,這是它的風格,到處找有什麼需求,早早就做在開發包裏。Unity很早就內置了英偉達的PhysX物理引擎。
PhysX有剛體碰撞、粒子系統、布料模擬等。粒子系統可以模擬煙霧、水流、火焰,布料模擬是處理衣服、旗幟的動態效果,效果接近真實。可以理解為,英偉達PhysX算法目標是逼近真實,並不是專門給遊戲開發用的,但用到遊戲上也還行。
虛幻5的默認物理引擎是EPIC自研的Chaos,以前是用PhysX的。對有些遊戲項目,Chaos更適合,因為它目標不是追求真實,而是遊戲效果。
在物理引擎作用下,遊戲世界接受玩家輸入,就可以不斷演化了。根據玩家視角,將3D遊戲世界呈現在2D界面上,這是遊戲開發的核心任務,處理顯示問題。
相關專業名詞是“渲染”(Rendering)、“渲染管線”、“着色器”(Shader)。要理解這三個名詞,需要先介紹3D動作遊戲運行的硬件特性,CPU+GPU,其中GPU起到了主要的計算作用。
象《黑神話》這樣講究視覺效果的動作遊戲,必須有GPU,檔次低了還不行。理論上只靠CPU,就可以把這些物理引擎、3D世界轉成2D顯示的算法跑下來。早在九十年代初,就有了《侏羅紀公園》、《終結者2》等特效電影,那時GPU都沒出來。但這些特效都是用很長時間做出來的,放出來1分鐘,做可能要1周。而3D動作遊戲,需要即時計算,就需要非常強大的GPU。
許多人對CPU的串行編程邏輯不陌生,但瞭解GPU編程的人就少多了。GPU有成千上萬個計算核心,可以並行加速計算過程。但有非常多的細節,這些核心並不是都一樣的,而是分成幾類,各有擅長的任務,GPU內部架構也不簡單。
着色器Shader,可以理解為GPU上跑的並行加速程序。有許多種Shader,完成頂點位置、象素顏色計算這些任務。給Shader準備好輸入數據,它就會把計算後的數據寫到顯存、內存上去。
遊戲開發引擎會提供多種Shader,開發者也可以自己編寫Shader,進行特別的處理。但光有Shader,相當於程序只有一些子函數,完成不了整個任務。
這時就需要“渲染管線”,安排好一連串處理動作,它是將3D遊戲世界的數據轉化成2D屏幕上一幅畫面的過程。可以把渲染管線理解為CPU + GPU編程,是一個軟硬件過程,每一步調用CPU或者GPU,其中會有多個不同的Shader完成主要的計算,CPU處理邏輯、準備數據。
遊戲開發引擎提供了渲染管線代碼,程序員可以修改。它會計算出現在“攝像機視角”的物體,將視角以外的物體剪裁掉,邊緣要處理。它需要判斷場景中的物體遮擋情況。對於每個物體,計算2D顯示的顏色值。
一種特殊的算法是天空渲染,其實就是6張“參考圖片”,作為天空採樣的紋理,對應立方體的6個面,天空渲染時根據當前位置方向計算出天空顏色值。在這個意義上,“天空盒”實際並不存在,沒有在場景文件裏。

一個遊戲的渲染管線編寫完成,關於圖形顯示的部分就好了。但是,如果換了GPU,可能需要換一種渲染管線。如果GPU不夠強,一些高開銷的Shader跑不了,就要換成低開銷的Shader,幀率、畫質就要降了。《黑神話》第一次啓動的時候,會進行“着色器編譯”,就是在根據機器的CPU+GPU組合,編譯出合適的二進制代碼,之後再啓動就不需要了。
《黑神話》對GPU的性能有要求,就是這個原因。如果GPU連遊戲最低要求的Shader都跑不了,遊戲就跑不起來。Shader不可能換成CPU跑,太慢無法接受。
要注意渲染管線只管顯示相關的計算,像遊戲的game play玩法和物理引擎,這些是另外的管線,也可能調用GPU。Rendering,就是指計算渲染一幀畫面、向顯存寫入畫面數據這個動作。渲染是動作,渲染管線是過程。
介紹到這裏,3D遊戲開發的主要脈絡就有了。但是還差一個最重要、最複雜的部分,光照模型。場景的樣子是由一個或多個光源光照的效應決定的,計算非常複雜,還與物品的材質有關。物品的材質其實就是物品與光線交互的性質,物體看上去是草、樹還是水,是吸收、反射、透明這些光照屬性決定的。
物體的顏色不是其固有屬性,而是由比較複雜的物理學理論決定的,涉及漫反射、鏡面反射、微表面理論等概念。在遊戲開發裏叫Physical Based Rendering,用於處理光線與物品的交互,光照模型也是渲染中的重要概念。
一個簡單的光照模型是,只考慮直射光,就是假定場景中的每個點都獨立地受各個光源直接照射的影響。光源可以抽象成點光源,平行光相當於無限遠、無衰減的點光源。要計算場景中一個點的亮度,就假定是所有點光源打在這個點上的複合效應。這個計算方法簡單,也能用GPU加速,能提供一個基本的光照效果,實際上大多數遊戲就這麼做的,但會顯得不夠真實。光線會在物體上發生反射、折射,等於又有新的光源了,簡單光照模型沒考慮到這個效應。
把光線的反射、折射效應也考慮進去,就是全局光照模型。理論上這非常複雜,直接光照、間接光照,還要積分。有一些傳統算法來處理,但現在硬件好了,就可以即時地用光線追蹤算法了,Ray Tracing,簡稱光追。

光線追蹤算法是從視點(眼睛)發出數以億計的光線,模擬與物體相交、反射、折射,反覆迭代,直到遇上光源,或者跑出去了、迭代次數夠多了。圖中藍線就是從視點發出的追蹤光線,根據折射、反射等效應產生次生光線。虛線代表光源對每個關鍵點的作用,光源主要的可能作用路徑都被考慮到了,最終可以計算出複合效應。可能的作用路徑非常多,但如果轉折太多次,光強就可以忽略了。
要注意,光線追蹤算法的光線是從眼睛逆向發出來去尋找光源,而不是從光源發出來,這是反直覺的。這是因為最終玩家是用眼睛去看畫面,眼睛能看到的光才有意義,從眼睛發出來光線逆向推導更有效。而光源發出來的光線,要機緣巧合才能到達眼睛,不適合用來做光線追蹤。
這是一種蒙特卡洛抽樣模擬算法,視點放出的光線越多模擬效果越好。光線追蹤算法效果最好,能夠模擬出很好的陰影、反射效果,水面反光、火焰倒影等場景很炫。GPU常用光追來展示性能,英偉達的RTX系列GPU,1秒鐘可以發出上百億根光線。


《黑神話》開光追的下圖,水體折射倒影效果驚人,上圖未開光追
《黑神話》等遊戲界面會有選項,選擇畫質、是否開光追等等。在一些場景,開光線追蹤會有明顯效果。例如這兩個圖對比,開光追的水體折射倒影效果驚人。
《黑神話》廣受好評的畫面展示,還有虛幻5引擎中Nanite技術和Lumen技術的功勞。

黑神話中的佛像羣,極精細的建模
《黑神話》畫面的一個特性是,無論近景、中景、遠景,看着都很自然。前面説過,一個物體的模型會有高精度和低精度,用於近景和遠景顯示,分幾級。但有時會有不太自然的感覺,精度有跳變。Nanite技術可以加載超高精度的模型(多達十億個三角面),幾何體更為真實細膩,這需要高效的幾何壓縮和內存管理。看程序需要,即時計算出合適的模型和場景顯示,而非存儲幾級低精度模型。這需要很好的優化,模型要渲染多少個面是動態決定的,看不見的、遠的就可以節省算力,等於模型本身都在動態變化。總體效果就是場景畫質很高,變化自然,即時流暢,達到了影視級的高質量畫面。

影視級的高質量畫面
虛幻5的另一個重要技術是關於光照的Lumen技術,讓《黑神話》的光影效果很出色。Lumen應用了“動態全局光照”,對光照模型進行了大幅優化,漫反射效果好。還有虛幻引擎的粒子特效系統Nigara,火焰、刀光、能量波、落葉飛舞效果很好。這些技術的具體細節非常複雜,我們感受下效果就好。

使用Lumen動態全局光照,陰影區明暗變化豐富,區域中接收了漫反射光
遊戲開發中的3D建模、圖形渲染、光照模型,是非常重要的前沿高科技領域。美國就是依靠計算機圖形學、遊戲開發等領域的領先,從九十年代起,在電影特效應用上取得了巨大成功,讓好萊塢的影響力傳遍全球。之前各國都有一些優秀的電影,美國優勢沒那麼大。
目前3A遊戲開發涉及的計算機圖形學技術還在快速進步,與高性能GPU開發聯動,是有戰略意義的技術前沿。因此中國需要支持高水平、高質量的遊戲開發,拉動技術應用與原創技術研發。《黑神話》的爆火,對技術進步來説,也是很好的消息。
三.遊戲開發團隊
介紹完了3D動作遊戲開發相關的圖形學知識,再來介紹一下游戲開發人員與團隊。
開發一個3D動作遊戲,需要三類開發者:寫程序的、搞策劃的、做美術的。人員可以兼職,但是任務分工就是這三類。另外還有音頻相關的,還有遊戲測試。有些開發人員是跨領域的,我們一個個來説。
3D遊戲程序開發的任務有客户端程序、引擎程序、圖形程序。客户端就是玩家面對的遊戲界面,客户端程序員開發實現遊戲玩法。引擎程序員,就是處理遊戲引擎相關的程序代碼的,高水平的能自己開發和修改引擎。圖形程序員,就是寫Shader、改渲染管線,加速圖形渲染的。
客户端程序員又分多種,有網絡方向、AI方向、game play方向、動畫方向、物理方向等等。相關功能,大型遊戲都可能需要。如果有後端服務器,也要開發後端程序。

《黑神話》中的遊戲文案
遊戲策劃也分多種,如系統策劃,負責煉丹、升級、道具這些系統的設計。關卡策劃,要設計地圖,給玩家過關設置重重挑戰任務。數值策劃,對遊戲精微的戰力、經濟等數值體系進行設計,有時是遊戲的核心機制。戰鬥策劃,讓打鬥更加精彩。文案策劃,輸出文字,讓故事與角色生動起來。
有一種特殊的策劃職位叫“技術策劃”,要懂遊戲開發技術,會用專業的數學建模與程序知識,參與策劃工作,彌補其它策劃的專業不足,提升策劃質量。
美術對於遊戲的成功非常重要,決定了遊戲的藝術感檔次,《黑神話》的美術風格,得到了極高評價。重要的美術職位有:原畫,畫出漂亮又藝術的角色、場景、物品,現在有AI幫助出圖效率高多了;3D建模,需要用DCC軟件對場景、物品、角色建模;動畫師,設計過場動畫、生產人物骨胳動畫資產,如角色的漂亮動作是放動畫師畫的姿勢動畫,畫30幀放出來90幀,多的是插值生成;地編,要編輯地圖,將各類模型放入關卡策劃設計的地圖裏;特效,設計各種精彩炫目的打鬥、魔法特效。
還有一種職位叫“技術美術”,瞭解美術,又懂圖形學,會編程寫shader。例如會用圖形學技術,將網絡收集的美術素材做出美術效果。技術美術的美術能力也不弱,可能校招進來就培養職場級的原畫能力,能生產商業美術資產,再加上技術能力,綜合實力就強了。
音頻方面,有負責藝術類音樂的,也有處理打鬥、動作音效的。還有“技術音頻”,將原始音頻素材處理出效果,如空曠場景、密集場景各有不同音效。
另外非常重要的是,遊戲要測試,測試工程師負責找出程序bug,最後讓程序穩定運行。還有負責“用户體驗”的,不是找bug,而是評價程序的用户感受,提出修改建議,提升遊戲作品水平檔次。
象《黑神話》這樣的3A大作,上面的這些職位應該都有。一些人會身兼數職,幾個領域都懂。
遊戲公司還可以將一些任務分解外包,能有效降低開發成本。據説《黑神話》的開發商遊戲科學有133名正式員工,還有500人的外包團隊。
土豪們!《黑神話》就是這樣開發出來的,不難吧?怎麼樣,來投錢開發一個吧?
家長們!看看遊戲開發有多少技術?來讓小朋友學學遊戲開發基本知識?
少年們!來玩下3A遊戲大作,看看遊戲是怎麼開發出來的。想想自己能做什麼,説不定,未來的遊戲開發天才,就是你了!