手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

遊資網發表於2020-02-12
這裡說的分析過程,不僅僅是簡單的使用截幀工具。因為只給美術提供截幀獲得的Draw Call數和模型的面數,參考意義不大,美術依然無法瞭解遊戲製作方法和流程。本文展示的方案包括擷取遊戲的各種資料,開發工具提取和分析資料,然後再匯入到自己用的引擎裡,復現其渲染效果。根據以往的一些經驗,如果用的是同一款引擎,復現效果可以達到100%。如果使用的引擎不一樣,復現效果也可以達到視覺上沒有明顯差異。

以某第三方自研引擎開發的遊戲為例,展示分析過程以及在Unity內重建的效果。

先對比下手機上最高畫質效果和Unity內覆盤效果。帶UI的截圖是真機遊戲第一個戰鬥場景畫面。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

下圖是在Unity內復現整個場景的效果。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

在截幀工具的選擇上,考慮到獲取真機上準確的資料,排除使用Nsight,GPA和模擬器。最終使用Adreno Profiler和Tegra Graphics Debugger,測試機選用MI3和MI Pad。

另外說明一下,高通推出了新的Snapdragon

Profiler。老的Adreno Profiler經常崩潰,擷取不到完整的Draw Call。原因是隨著高品質遊戲出現,profiler已經無法準確判斷頂點緩衝裡的資料格式。老版本profiler還是拿簡單的頂點格式去套用到新遊戲上,所以經常會出現異常。新的Snapdragon Profiler乾脆直接把存頂點資料的功能給去掉了,以保證其穩定性。但是減少了profiler一個重要的擷取功能。

但是每個裝置廠商的profiler截幀取到的現場資料是完整的,只是無法提供正確的分析結果。針對這個問題的解決方案是自己寫一套vertex buffer,index buffer和API events分析提取除錯工具,根據不同的頂點緩衝格式資訊提取模型,最後再寫一個FBX匯出外掛,把obj檔案轉成Unity可用的assets。最後,Shader的還原,這方面只有靠經驗和人肉翻譯了。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

以上是Unity內覆盤後Scene視口的效果。可推測出具體的一些製作細節:

1.地形以Tile為單位,每個Tile的長度是32米。Tile分三層,每層有albedo和法線貼圖,根據一張Mask貼圖做混合。示例場景用了5個Tile。其中一個完整的Tile,其他四個Tile是面積很小的碎片。

2.場景支援天氣系統,分別支援雨天和雪天。可以通過材質引數控制雨雪在地面上的厚度表現。

3.每個模型物件分兩個頂點緩衝。第一個緩衝記錄位置,法線,切線和兩套UV,第二套UV為lightmap uv。第二個緩衝是用編輯器烘培上去的,記錄的資訊有:a)lightmap的編碼對映資料,uv定址資訊,b)模型的世界座標矩陣,傳入shader內計算。這樣做有利於draw call的合批。

4.植被分兩種,帶動畫和無動畫的。

5.模型材質的Lod分兩種,高畫質採用基礎的金屬度物理渲染模型(Physical-based Shading),使用到albedo,metallic,normal和lightmap貼圖,比如視野範圍內的石像。低畫質採用簡單的albedo diffuse加Lightmap,比如視野範圍遠處的房屋古建和浮島。類似浮島這種獨立於Tile之外的場景沒有合批,世界矩陣還是單個傳入pipeline。這種方式符合2.5D視角設計。

6.光源採用一盞平行光主光源,最多支援四個點光源。示例場景中實際使用了平行光產生diffuse,另外加了一盞點光源。點光源掛在角色的身上,跟隨運動。這也是遊戲截圖和Unity復原圖中光影細微差別的原因。因為兩幀角色站立的位置不一樣。

7.示例場景一共使用了6張1024的lightmap。

8.支援兩種霧效,1)高度霧和距離霧混合2)使用貼圖的體積霧。最高畫質使用的是第一種。

9.天空盒模型掛在攝像機上,跟隨其運動。世界座標在Shader根據視錐屬性計算得出。

上篇對手遊場景的逆向分析,接下來的內容針對第三方遊戲在真機上的角色渲染,分析還原其效果。仍然以某自研引擎開發的第三方遊戲為例,介紹在Unity內還原遊戲的角色效果。

首先看真機效果和還原效果對比。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

上面第一張帶UI的是遊戲截圖,第二張是分析後Unity內還原效果,第三四張是還原的角色近景。

GPU資料的擷取使用高通和Nvidia的工具。模型的提取轉化需要注意的地方有:

1,因為高通的profiler擷取的頂點資料經常丟失,相關buffer用Tegra Debugger去截。

2,Unity匯入切線時會自動normalize,而NeoX引擎的模型會用切線的長度記錄資訊,同時FBX,unity對單個uv不能同時支援四個通道,所以自己寫工具處理FBX檔案時需要做一個trick:用兩套uv對切線進行編解碼。

3,骨骼動畫採用GPU計算,而Unity在CPU計算。為了方便展示,模型需要帶有骨骼動畫pose,這個在匯出FBX時把截到的骨骼矩陣計算到頂點。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

材質Shader人肉翻譯,解析提取後總結如下:

1,角色分為三部分,身體,頭部和頭髮繪製(不包括武器道具)。

2,角色光照。實時光包括一盞平行光和點光源,預計算Spherical Harmonics Diffuse對角色補光,美術可以通過引數修改lighting的佔比,以及再打一盞平行光補光,避免出現明暗劇烈過渡。

3,頭髮的SH Lighting在頂點計算,身體的SH Lighting在畫素計算。

4,角色的Spherical Harmonics Diffuse在展示介面和場景內設定是不一樣的,但是在同一個場景內,SH都是一樣的。反射則是靜態的,永遠保持不變。

5,服裝金屬部分,採用GGX BRDF模型。

6,皮膚部分3S的表現主要是對diffuse進行線性warp處理。

7,頭髮各向異性效果,通過brdf+副法線方向上對反射的多次擾動實現。

手遊逆向分析: Unity內還原遊戲場景/角色渲染效果

附:騰訊光子工作室群技術美術組招聘 Shading Tech Artist(含實習生,長期有效)


作者:大星星
專欄地址:https://zhuanlan.zhihu.com/p/26215257

相關文章