手遊逆向分析: Unity內還原遊戲場景/角色渲染效果
以某第三方自研引擎開發的遊戲為例,展示分析過程以及在Unity內重建的效果。
先對比下手機上最高畫質效果和Unity內覆盤效果。帶UI的截圖是真機遊戲第一個戰鬥場景畫面。
下圖是在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內覆盤後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內還原遊戲的角色效果。
首先看真機效果和還原效果對比。
上面第一張帶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時把截到的骨骼矩陣計算到頂點。
材質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+副法線方向上對反射的多次擾動實現。
附:騰訊光子工作室群技術美術組招聘 Shading Tech Artist(含實習生,長期有效)
作者:大星星
專欄地址:https://zhuanlan.zhihu.com/p/26215257
相關文章
- Unity製作遊戲中的場景Unity遊戲
- Unity遊戲框架設計之場景管理器Unity遊戲框架
- 遊戲場景渲染中的PostProcessing(後處理)遊戲
- 記一次逆向分析解密還原Class檔案解密
- Unity GameFramework丨(八)場景UnityGAMFramework
- 雲渲染技術的兩種場景還在傻傻分不清?
- Unity實現“籠中窺夢”的渲染效果Unity
- 製作遊戲是先有劇本還是先有地圖、場景等內容?遊戲地圖
- unity實現場景跳轉Unity
- 不要總拿角色、場景談需求!
- 如何分析休閒遊戲的廣告場景?遊戲
- Sundberg:二手遊戲盛行的原因:遊戲過短 場景不夠遊戲
- [Unity-24] Unity的四種載入場景的方法Unity
- Unity C# 打包AssetBundle與場景UnityC#
- Unity3D裡場景跳轉Unity3D
- unity場景匯入iOSAPP求助UnityiOSAPP
- Unity遮罩之Mask、RectMask2D與Sprite Mask適用場景分析Unity遮罩
- Unity手遊iOS記憶體分析和測試UnityiOS記憶體
- 改編不是亂編:我們是如何在遊戲中還原《紅樓夢》經典場景的遊戲
- 直播影片美顏SDK在不同場景下的表現效果分析
- 原畫人場景原畫教程,畫場景的思路是怎麼樣的?
- Unity 高清渲染管線 ShaderGraph 實現簡單的表面水流效果Unity
- 分析“英雄射擊遊戲”的角色設計遊戲
- unity入門—資源匯入與場景建立Unity
- Unity的Flutter元件渲染UnityFlutter元件
- 技術分享 |《原神》部分渲染效果分析(非官方)
- D2C:日本手遊廣告與效果分析
- 基於使用者角色的資料庫智慧監控系統應用場景分析資料庫
- unity學習之角色移動Unity
- Unity2D遊戲開發基礎教程1.2專案、資源和場景Unity遊戲開發
- Unity2D遊戲開發基礎教程1.2 專案、資源和場景Unity遊戲開發
- Unity也做遊戲了?而且還會開源?!Unity遊戲
- Unity大密度建築場景載入解決方案Unity
- 遊戲運營活動效果分析(四):開新服效果分析遊戲
- 遊戲基礎知識——“載具內部”場景的設計手法遊戲
- Unity3D引擎助力 《魔域手遊2》實機畫面效果展示Unity3D
- Android逆向之旅---手遊「狂野飆車極速版」內購破解教程Android
- 場景分析:遊戲關卡難度對玩家流失的影響遊戲