技術分享 |《原神》部分渲染效果分析(非官方)
地址:https://zhuanlan.zhihu.com/p/246531456
宣告:《原神》繫上海米哈遊影鐵科技有限公司版權所有。本文僅對遊戲內出現的部分效果進行個人理解上的技術分享。本文並不涉及任何資源破解,解包等任何對該遊戲的hack行為,因此並不保證與遊戲中的實現方式一致。請自覺維護原著者版權。
以上!!!!
一、光與影
遊戲中的影子大致可以區分為以下幾類:
1.場景的靜態烘焙陰影
遊戲中的場景應該主要還是基於lightmap實現的靜態陰影。對於植被並沒有計算lightmap,其實我感覺可以在草等植被的下方利用AO去改善以下草等植被的光影效果的。
因為開放世界的超遠視距,我猜測,遊戲的lightmap是分3個級別的。近距離高精度的lightmap,中距離低精度lightmap,遠距離烘焙頂點色lightmap。
諸如草這種植被,是不進行lightmap的烘焙的
近距離下,灌木叢還是有lightmap的
中距離下,灌木植被陰影消失
這種超遠距離下的lightmap可能就直接烘焙到低模頂點色上了
這裡順便補充一點,因為時間有限,隨便看了幾個相關視訊,所以並不清楚遊戲中是不是有實時的場景光影,所以靜態烘焙這部分也只是猜測。如果有實時的光影變化的話,我可以再提供幾個思路,一個是distanceShadowMask的思路,就是遠距離烘焙與近距離實時結合。另一個是預烘焙多角度lightmap思路,就是提前將陽光多個角度的lightmap進行預烘焙,通過插值進行過度。我記得哪個遊戲好像用過,我有空找一下,後面補上。
2.靜態物件模擬實時投影
因為草是不烘焙lightmap的,但陰影下的草又如何變暗呢?還有角色走到陰影下面,又是如何處理的呢?應該是使用的lightprobe,就是光照探針。
使用光照探針實現明暗處角色的區別,草也一樣
光照探針沿著陰影邊緣裡外佈置兩排(保證暗部小球可以被陰影遮擋,有時候,可能會根據光照角度稍微傾斜,而不是上圖的直上直下)即可實現這種效果
3.實時陰影
這部分主要用來實現可動物件對場景的實時投影。從我的觀察來看,遊戲中的可動物件的實時陰影是使用的ProjectShadow實現的。就是設定一個與光照角度一致的正交相機跟隨角色進行拍攝,設定一定的拍攝範圍,並在邊緣進行陰影過度。然後使用Project將渲染的圖投影到地面即可。好處是投影的距離可控,投影的物體和接收陰影的物體可控,陰影解析度高,且不進行燈光深度繪製的草上也可以繪製陰影,一句話就是效能較好。
角色的陰影投影到草上(草是不會進行燈光深度繪製的,要實現陰影,只能如此)
缺點自然是無法實現真實的陰影投射和在陰影下會產生雙重陰影的問題。
因為陰影接收體僅包含地面和部分地表物體,因此,可動物件之間是不會相互投影的
遊戲對雙陰影進行了修復(其實也簡單,接收陰影體設定好陰影最低閾值即可),細看還是能看到角色投到牆體上的更深的陰影。
PS:卻產生了一個意外效果,模擬了AO,哈哈
4.體積陰影——雲影
目前遊戲中我看到的相關的體積陰影只有雲的影子。說體積陰影貌似也不確切,畢竟雲也是粒子面片,不是體積模擬。做法倒是也簡單,所有非特效物體的材質中內建一張明暗噪波圖,然後以世界座標的xz進行取樣,並新增UV動畫,來模擬雲投射到地面的影子。就是說與天上的雲其實沒啥相關性。
諸如此類的圖即可
嗯,對於室內呢,肯定是不會受雲的影子影響的,所以還需要增加一個判斷。例如跟隨角色增加一個垂直照射的相機取樣當前位置的深度,取樣雲影的時候,計算以下頂點距離垂直相機的距離與深度比較即可(諸如雨雪等的垂直遮擋也是這麼做)。或者更簡單粗暴點兒的話,就是無視就好了,畢竟就算是現實中,大片雲飄過,屋裡也是會暗一下的。
5.角色臉部卡通明暗
米哈遊的卡通渲染,在國內一直是做的很牛逼的了。尤其是臉部非常舒服的明暗過度以及鼻翼、三角區的特殊陰影表現。這部分因為比較特殊,我這裡就詳細介紹一下其相關原理。
非常舒服亮眼的卡通陰影表現
這部分的實現,其實知道原理的話,也非常簡單。
首先,卡通渲染的光照修正主要通過兩種手段進行。
(1)最早期的日本的模型法線修正法。在3dsmax或其他三維製作軟體中,對模型的法線進行修正,例如將臉部按照球面將法線整平。這部分可以通過指令碼進行自動實現,從而提高效率。
通過法線修正,讓臉部的光照明暗更加“卡通”
(2)從罪惡裝備X開始興起的AO圖修正法,這方法,崩壞3也採用了。就是通過繪製AO圖的方式,對光照的數值進行修正。
就是下面那張附到模型之後,看上去類似AO的貼圖效果
這是我目前知道的主要的兩種手段,一般來說,兩種方法會混合使用。法線修正可以提供比較整體的卡通光照效果,而AO修正,則可以實現更加細節上的調整。
而諸如遊戲中這種細節上的修正,更大的可能就是使用了AO圖進行修正。將臉部三角區這種會更久的受光部分繪製淺色,將鼻翼這種更早進入暗部的部分繪製暗色,就能實現上圖的效果。
頂上的暗部表示頭髮陰影,淺色是三角區,深色是鼻翼暗部
但是,但是這裡產生了一個問題。因為鼻翼一旦繪製了深色,雖然從受光進入背光時,會更快的進入,是對的。但當從背光進入受光時,因為鼻翼的角度,應該更快的進入受光才對,但這裡,仍然會因為AO的問題,延遲了變亮的時間。三角區的問題也一樣。從背光進入受光時,提前受光是對的。但從受光進入背光時,因為角度,是應該提前背光的,但淺色卻讓三角區的變暗延後了。
注:這裡我從網上下載了《崩壞3》的部分模型,進行了相關測試。《崩壞3》繫上海米哈遊影鐵科技有限公司版權所有。以下部分展示均基於該模型,僅作為技術交流分享。如侵權,我會接到通知後刪除並替換為其他模型。
光照從左往右,右側的臉,背光部分是正確的,但受光部分的明暗明顯不對
所以,這樣簡單的繪製一個顏色顯然是不行的。道理這裡也已經很明瞭了,光影的繪製,是需要基於受光和背光兩種的。受光時,鼻翼更早進入亮部,背光時,鼻翼則首先變暗。三角區則相反。所以,可以繪製兩張圖,一張繪製受光情況,一張繪製背光情況,如下:
左側背光時取樣,右側受光時取樣
而判斷是否受光,只需要判斷相對於臉部的朝向,燈光的朝向向左還是向右即可來決定。
嗯,鑑於米哈遊官方並沒有進行相關解密,且我們專案也在使用我的方法實現該效果,所以這裡就不進行更詳細的說明了。
目前我本人實現的效果圖
嗯,主要的光影部分就說到這裡。下面說物理(模擬物理)。
二、物理的模擬
這裡主要說一些類似物理相關的東西,例如:IK,水紋,地表屬性
1.腳步IK(反向動力學)
最早知道IK這東西,還是我在昱泉國際的時候,有幸參與了流星和射鵰三部曲的相關開發。之後很久,在國內遊戲中就幾乎再也沒見過相關的效果,直到今天的原神。它的效果就是如下:
腳部位置會根據站位的高低差進行自動修正,避免腳部穿插進地面
這部分的實現,是通過檢測玩家腳部的地面高度位置和法線,自動對腳部進行位置的修正。
通過預設站姿,獲取腳步位置(射線檢測)地面的法線,進行腳步角度調節。獲取高度,進行大腿旋轉角度、膝關節和腳步新位置的調節
據我所知,IK的調節是通過對新位置的多次迭代來進行修正的。
遊戲貌似只對待機進行了修正,其他動作還是會穿
當然,遊戲中,對地面的資訊獲取,可不止於高度和法線,還有其他東西,後面會說。
後來看到還有爬牆,還以為做了類似爬梯子的抓取位置定位功能呢。這樣,手部,腳步IK就全了。不過結果並不是,只是牆面的UV進行了對齊。
手部位置對齊了牆的縫隙,腳步就差了點兒。調整一下UVScale會不會就能對齊了?專案組肯定試過,不過可能因為磚縫過密,就放棄了
2.水紋
當角色從水裡移動時,水面產生的漣漪。不過遊戲中只是播放了粒子動畫,且漣漪也是正圓型的簡單漣漪。
不論移動還是靜止,都是圓形的漣漪
其實也可以試試,實現一下三角型的漣漪,不是更有感覺嗎?
坦克世界中通過頂點運動和法線擾動產生的三角漣漪
美術繪製三角形漣漪紋理,做類似圓形漣漪相同的擴散粒子效果(或者用UV序列幀實現)。然後程式端,根據角色的移動與否,播放原型或三角形粒子特效。如果是移動的話,還得在播放三角漣漪效果時,根據上一幀的位置,對粒子特效進行一定角度的旋轉,讓三角漣漪的頂點一直朝向運動方向。
3.地表屬性
遊戲中,地面是分為很多種類的,且人在上面會有不同的屬性或行為。例如水面會潮溼,溼地會有腳印,乾地跑動會有塵土,草地會有碎草等。
潮溼地面的腳印,腳印本身,用粒子效果即可實現
這部分實現其實不難,主要在於工具流的實現。
這裡說下我的方案:在刷地形紋理的時候,將地表的紋理屬性繪製到紋理的A通道,例如:畫素顏色0~10表示溼地,30~40表示乾地。然後正常進行地表紋理的刷制。shader中使用開關進行地面A通道值的繪製,並根據混合紋理的權重,取最高權重的紋理A通道值作為地面A通道的主屬性。並根據權重值,對屬性值進行0~10的衰減。例如:該位置通過溼地和乾地紋理進行混合,混合值為溼地0.8,乾地0.2。則該位置的A通道主屬性值就是0~10的溼地。再假設權重值從0~1對應屬性值進行10~0的衰減。則這個位置的屬性值就是8。
地表製作完成之後,就可以使用工具,將地表A通道的值烘焙到地表頂點色上了。
然後,遊戲中就可以在修正IK的同時,返回角色位置的頂點顏色,來進行對應地面屬性的表現了。
當然還有很多辦法進行實現,例如擺放屬性標識面片等。
下面說一下游戲中的植被——草。
三、草
遊戲場景中是存在大面積,很密集的草地表現的。這部分如果使用通常的渲染方式,消耗是很大的。要實現甚至在手機上也能執行的效果,只可能使用ES3.2才可以使用的GPU例項化渲染了。
目前Unity一共支援三種GPU例項化渲染介面,
相比來說,Graphics.DrawMesh實現最簡單,unity內建的材質instance就是這種。但相對來說,效能也最差。
Graphics.DrawMeshInstanced相對來說實現比較複雜,需要手動傳入各種渲染資訊,且存在同批渲染上限,但效能比Graphics.DrawMesh要好出不少。
Graphics.DrawMeshInstancedIndirect的實現最為複雜,需要自己申請引數緩衝區進行傳參。但優勢就是沒有同批上限,效能最好。
幾年前我對三種草進行測試的時候,資料如下:
我機器顯示卡1060,40000顆草不進行裁剪,開啟實時陰影,且實現與人的互動。Graphics.DrawMesh是4幀左右,Graphics.DrawMeshInstanced為57幀左右,最高效能的Graphics.DrawMeshInstancedIndirect為90幀左右執行。
然後再回到遊戲中。
貌似遊戲中的草和角色的互動表現比較弱,也可能是我沒看出來。然後說一下草的燃燒效果。
地面的草被火屬性技能攻擊到時會燃燒+枯萎
這個效果的實現原理上來說其實也比較簡單。火焰其實和草並沒有真實的互動。燃燒效果是技能釋放位置和半徑區域內,固定間隔的隨機位置擺放火焰特效。如果該位置有草,就播放燃燒粒子特效,沒有就不新增特效(如何判斷是否有草可以參考地表屬性部分)。
然後草的燃燒枯萎效果,其實就是在草的shader中,新增一個巨集開關,當需要播放燃燒枯萎效果時,將開關開啟,然後根據傳入的技能範圍,判斷草是否處於該位置,來在普通草紋理和枯萎紋理(或乘上枯萎顏色)中進行權重過度即可。消失過程,可以使用UV從上往下的根據時間的discard。追求效果,還可以在切口處疊加一個銳利的噪波來實現燃燒狗牙效果。
草燒過之後的枯萎效果
四、其他效果
1.地面屬性互動
說起地面屬性互動玩法,原神剛爆出這個玩法的時候,一堆人說抄襲塞爾達巴拉巴拉,云云的。
嗯,怎麼說呢,專案組肯定是很大程度上參考了塞爾達的各種效果和玩法,但這並不應該是抨擊遊戲的一個點不是?
說句不好聽的,就這種地面屬性互動的玩法,我也可以說塞爾達(2017)抄襲神界3原罪(2015),神界3原罪抄襲激戰2(2013),激戰2抄襲深淵傳說(2005),深淵傳說抄襲重灌機兵(1991)呢。玩法嘛,我們就沒必要追根溯源了,用自己遊戲的方式呈現給玩家,讓玩家能樂於其中,這就夠了啊。
原罪中,被各種屬性“汙染”的地面
回到實現上,這裡說一下最常見的冰效果。玩家釋放冰屬性技能以後,在水面上會結冰,玩家可以站在上面。特效表現上,這裡使用的是Mesh面片貼地的方式實現的,而不是投影或decalMesh。
貼地的面片會和其他物體產生穿插
投影的話,效果是可以覆蓋地面物件的,decalMesh同理
嗯,既然是Mesh嘛,那冰上的一些效果就可以通過檢測Mesh的方式去各種實現了。
2.深度和扭曲
遊戲中是開啟了相機深度的,這樣,就可以實現諸如水邊和粒子交界邊緣的柔和過度了。
水的邊緣和火焰粒子貼地位置的柔和過度
且採用了GrabPass(或RT方式)實現了水下的扭曲和散焦光斑。
3.雲海和霧
原神沿用了崩壞3的一貫做法,使用粒子面片的方式來實現雲海的效果。
面片感還是有的,不過和天空球上的雲體呈現在一起看,效果還是可以的
估計專案組應該也嘗試過光線步進的做法,不過要實現這種卡通風格的效果的話,可能就不太理想了。
遊戲中的霧應該也是採用的距離+高度霧,疊加粒子霧效的擾動。不過整體使用了大氣散射的效果,所以空間感和顏色及光感上表現的更好。
最後,說一下開放世界
策劃相關的開放世界,可以參看我之前的帖子,這裡就不說了。
簡單說一下開放世界的渲染和技術實現的一些東西。
1.載入
開放世界的遊戲不同與傳統的關卡類的遊戲,它並沒有場景載入單元的存在。換句話說,遊戲展現在玩家面前的就是整個遊戲的世界,幾乎所有可視資源都要進行載入。這種體量按照普通的方式進行實現,顯然很不現實。米哈遊從崩壞3開始,就在嘗試做開放世界的相關東西。而其中的大頭我估計就在資源的如何合理載入上。
一般來說,大世界遊戲,會將地表進行切塊處理,並將地表塊上相關的資源(物件,紋理,光照等等)進行繫結。然後根據玩家所在區塊,以九宮格方式進行載入(就是會預先載入除玩家所在區域外的周圍幾個區域)。再根據視錐,對前方額外的可視區域進行低精度載入。
雖然說起來很簡單,但裡面真正的細節很難處理。例如:區域交界的光照,陰影紋理如何生成,如何消除接縫,如何進行距離的Lod過度。載入和解除安裝的策略又如何,Lod策略又如何。相關的美術製程和工具流又如何實現,等等。或許只有經歷過的人才會清楚其中的痛苦了。
2.效能
除了載入能搞定的一部分外,還有載入後的超視距的渲染壓力是需要處理的。別的不說,Unity的整個地形系統就要重寫。地形Mesh需要根據距離進行自動Lod,材質和紋理也需要進行相應的Lod處理。
地形Mesh的二元三叉樹Lod,優勢就是沒有接縫
然後就是各種Lod的優化策略。例如傳統的減面Lod,各種遮擋剔除(設定Collider,設定Area和Potal),遠距離的imposter策略等等。
這些每一個系統,Unity都沒有很好的解決方案,都需要自己去實現或者優化。而這些還都需要配套的美術工具讓美術進行最優的設定。
所以,開放世界的遊戲,可真的不是想做就能做的啊。
先這些吧,後面想起什麼再進行補充。
還是那句話,以上都是我基於視訊效果的個人解析。並能不保證和官方一致甚至是正確性。還請謹慎參考。
最後,尊重原著,尊重智慧財產權,不要對遊戲進行違規操作和討論。感謝。
下面我補充一些評論中的問題:
1.為什麼反編譯、解包別人遊戲這麼普遍了,我這裡卻禁止討論。
我不會評價這種行為的對錯好壞,國家之間尚存在資訊諜戰,我當然知道這種行為的普遍。但普遍並不表示就合理,就像996。
當遊戲開發商們的所有技術,所有經驗都不再稱為技術壁壘的時候,只會產生兩種結果:
投入產出不成比,不會再有公司花精力去研究新東西,技術裹足不前。
天下一統,沒有了多樣性,失去了未來進化的可能。
所有的惡果,最後會毫無保留的奉還給整個遊戲業。
我這裡都是基於我自己的知識和遊戲視訊中的效果進行的猜測,自然和他們原本做法會有偏差,甚至大相徑庭。但卻產生出了更多實現的可行性猜測。
最後,我是基於別人的作品,分析別人的作品,相互的尊重應該是我起碼的底線。
2.移動平臺效果會怎樣,如何看待多端。
其實這個遊戲多平臺的意義並不在於或者是說重點不在於多平臺上的美術表現上,而是它打通了不同平臺之間的網路壁壘,為多平臺遊戲模式協作提供了可能性。
舉個簡單栗子,我在PC平臺上爽戰鬥,在移動平臺上看劇情做養成,在遊戲機平臺上多手柄的家庭互聯,一個遊戲,N種模式,徹底霸佔你的所有時間,哈哈。
3.如何評價原神中,米哈遊的技術實力體現。
首先,卡通渲染的效果,目前來看,在經歷了無光,受光,描邊,法線,3S,pbr,多材質混合,大氣等效果的進化後,也逐漸進入了一個瓶頸期了。
後面大概率會往兩個方向走。一是更風格化的美術,例如柔和油畫,國畫,厚塗等效果風格。二則是基於pbr理論的風格化材質,例如卡通毛髮,卡通絲綢塑料等材質區分表現。而米哈遊應該是精於第二條路,但會更多的受限於平臺效能。
其次,本遊戲既然多端互聯,又是開放世界。所以,美術效果上必然進行了妥協。不能充分體現米哈遊的技術實力。
要說的話,這個遊戲可能更多的體現了米哈遊對新遊戲模式的快速吸收實現,美術工具流的完善和對引擎開發改造上的能力了。
相關文章
- 米哈遊弋振中:從手機走向主機,《原神》主機版渲染技術分享
- 效果資訊[gdc13]《刺客信條3》渲染技術
- 大部分的《原神》分析和評價到底哪出問題了?
- vue:服務端渲染技術Vue服務端
- Vue 服務端渲染技術Vue服務端
- 技術面試 android部分面試Android
- 原神深度分析報告(上)
- 資料加密新技術-實時雲渲染技術應用加密
- 分析技術
- 技術分享| HTTP 代理HTTP
- 技術分享主幹
- OpenGL的渲染成紋理技術(轉)
- 點對點分析CII與等級保護系列:安全技術部分(二)
- 點對點分析CII與等級保護系列:安全技術部分(一)
- 手遊逆向分析: Unity內還原遊戲場景/角色渲染效果Unity遊戲
- 技術分享連載(六十)
- Joel 技術分享心得
- 真實感皮膚渲染技術總結
- unity程式使用雲渲染技術是否要修改?Unity
- 技術選型的藝術---湖北技術價值分享會
- Android技術分享|【自定義View】實現Material Design的Loading效果AndroidViewMaterial Design
- 阿里巴巴部分技術BLOG阿里
- Android技術分享| Android 中部分記憶體洩漏示例及解決方案Android記憶體
- 剖析Unreal Engine超真實人類的渲染技術Part 2 - 眼球渲染Unreal
- 高德「渲染練習生計劃」啟動,開啟專業渲染技術人旅程!
- 技術宅找女朋友的技術分析
- 技術分享:記憶體管理記憶體
- 技術分享 | AlertManager 原始碼解析原始碼
- 技術分享 | ClickHouse-Keeper 初探
- IntelFPGA技術大會分享IntelFPGA
- 360黑客攻防技術分享會黑客
- 關於技術分享的思考
- xMIS需求分析技術
- 掌趣科技林若峰:次世代手遊《黑暗之潮》渲染應用經驗及技術分享
- 什麼是真正的敏捷開發?阿里資深技術專家內部分享公開敏捷阿里
- 我們和米哈遊技術總監弋振中聊了聊《原神》在PS5上的技術追求
- 培訓效果評價技術(轉載)
- Cocos 技術派:實時競技小遊戲技術實現分享遊戲