日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

技术分享 |《原神》部分渲染效果分析

發布時間:2024/8/26 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 技术分享 |《原神》部分渲染效果分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、光與影

游戲中的影子大致可以區分為以下幾類:

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》系上海米哈游影鐵科技有限公司版權所有。以下部分展示均基于該模型,僅作為技術交流分享。如侵權,我會接到通知后刪除并替換為其他模型。
?

光照從左往右,右側的臉,背光部分是正確的,但受光部分的明暗明顯不對


所以,這樣簡單的繪制一個顏色顯然是不行的。道理這里也已經很明了了,光影的繪制,是需要基于受光和背光兩種的。受光時,鼻翼更早進入亮部,背光時,鼻翼則首先變暗。三角區則相反。所以,可以繪制兩張圖,一張繪制受光情況,一張繪制背光情況,如下:
?

左側背光時采樣,右側受光時采樣


而判斷是否受光,只需要判斷相對于臉部的朝向,QQ號碼轉讓平臺燈光的朝向向左還是向右即可來決定。

嗯,鑒于米哈游官方并沒有進行相關解密,且我們項目也在使用我的方法實現該效果,所以這里就不進行更詳細的說明了。

目前我本人實現的效果圖


嗯,主要的光影部分就說到這里。下面說物理(模擬物理)。

二、物理的模擬

這里主要說一些類似物理相關的東西,例如: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
  • Graphics.DrawMeshInstanced
  • Graphics.DrawMeshInstancedIndirect



相比來說,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理論的風格化材質,例如卡通毛發,卡通絲綢塑料等材質區分表現。而米哈游應該是精于第二條路,但會更多的受限于平臺性能。

其次,本游戲既然多端互聯,又是開放世界。所以,美術效果上必然進行了妥協。不能充分體現米哈游的技術實力。

要說的話,這個游戲可能更多的體現了米哈游對新游戲模式的快速吸收實現,美術工具流的完善和對引擎開發改造上的能力了。

總結

以上是生活随笔為你收集整理的技术分享 |《原神》部分渲染效果分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。