《秦时明月世界》手游如何用Unity定制化渲染管线?
由玄機科技正版授權、魔方工作室群研發(fā)的經(jīng)典國漫IP改編手游《秦時明月世界》,收獲了廣大玩家和原著粉絲們的一致好評,在TapTap上評分高達8.6。這款游戲是魔方工作室對3D大世界MMO的首次嘗試,也融匯了他們在玩法和技術方面的探索。
騰訊魔方工作室高級工程師王毅以“《秦時明月世界》手游的定制渲染管線”為主題在Unity線上技術大會上發(fā)表演講,介紹了《秦時明月世界》手游如何借助Unity實現(xiàn)定制渲染管線技術,具體包括相機與顏色空間、深度圖、Grab Pass、后處理和多光源幾個方面。
以下為王毅的演講內容:
?
《秦時明月世界》手游是一款大型MMO手游。首先給大家展示一下游戲中殘月谷的一段關卡戰(zhàn)斗,整個戰(zhàn)斗過程結合Unity的TimeLine,我們做到了一鏡到底,無縫切換的戰(zhàn)斗和動畫的表現(xiàn)形式。
?
今天主要是給大家?guī)怼肚貢r明月世界》定制化渲染管線技術相關的一些介紹。主要分幾個維度,包括相機與顏色空間、深度圖、Grab Pass、后處理和多光源這幾項。
?
《秦時明月世界》中基于相機和顏色空間表現(xiàn)的準備工作,主要是分辨率的分離,UI高清,場景動態(tài),平衡效果與效率。
我們在整個3D游戲世界中,經(jīng)常會基于PBR的高清的線性空間制作,但是常規(guī)的UI美術平時習慣于在Gamma空間工作,導致兩邊的工作流程有一些沖突。UI的美術不太適應線性空間的流程,也不太適用線性空間下的顏色在他們的自產工具里制作。
但是,我們游戲中要使用在線性空間下的流程。為了他們的統(tǒng)一,我們會將分辨力進行分離,把UI進行高清的分辨率顯示,場景進行動態(tài)控制,場景中使用線性空間的流程,UI使用Gamma空間的流程進行繪制,這樣就可以保證場景基于不同的機型、不同的表現(xiàn)形式進行一個動態(tài)分辨率的調整,保證UI的高清化。同時也使UI的資產可以在Gamma空間下進行正確的顯示,保證游戲中場景的線性空間的顯示和UI的Gamma空間的顯示可以在一個正確的流程下工作。
我們的過程就是場景中使用一個線性空間的表現(xiàn)形式,它有單獨的相機區(qū)進行繪制,同時在與UI相機進行blender,輸出到屏幕上。然后場景空間的相機進行Gamma校正,而UI本身就是在Gamma空間的流程進行工作的,所以它不需要Gamma校正。
?
接下來再說一下我們基于深度圖的改造。
Unity為我們提供了深度Pass這個過程,幫助開發(fā)者可以在游戲項目中快速的某一階段獲取深度圖來進行繪制及采樣深度進行渲染。
《秦時明月世界》進行了定制化的改造,在非透明物體中如果需要使用深度圖,就會采用深度Pass這種方式去獲取深度圖,如果在非透明的物體下不需要使用深度圖,我們就會采用深度圖獲取的方式,直接從深度Buffer中拷貝出來深度圖進行使用,這樣可以有效地減少額外的DC造成的渲染消耗,尤其是對一些低端手機或者是對于DC特別敏感的手機來講,這種使用方式效率會更高。結合這兩種方式,我們就會更高效地使用Unity的深度圖。
我們在Unity的PC版、Unity的Editor,包括iOS版本都會使用翻轉的Depth這種結構來表示深度Buffer,但是在安卓平臺,由于OpenGL ES的限制,并沒有使用這種方式。為了統(tǒng)一這個方式,我們進行了改造,在安卓平臺也使用深度翻轉的這部分使用深度Buffer。
主要原因在于,我們的美術,尤其是關卡設計師和模型師在進行關卡設計和資產設計的時候,他們基本上是在PC平臺或者是在非移動端進行關卡的組合以及關卡的布置,這樣往往會出現(xiàn)一些因為經(jīng)度問題,導致關卡進入到實際的手機或者是移動端的版本上,尤其是安卓的平臺,由于精度的問題,會出現(xiàn)一些關卡上顯示的瑕疵。這個時候美術師或者是關卡設計師就需要反復調整關卡的結構,來保證顯示效果的正確,相對來講是一個漫長耗時的過程,因為移動端要涉及手機端的APK的打包,這些過程都會影響到整個關卡制作的進度。
為了統(tǒng)一這個方法,我們就在安卓端也使用了深度翻轉的技術,QQ號購買平臺保證和在PC端以及iOS端使用相同的Buffer處理形式,這樣就可以大大地緩解關卡設計師在制作階段因為深度沖突導致的顯示中的瑕疵,統(tǒng)一關卡設計中因為平臺化造成的精度問題引起的顯示上的瑕疵。整體來講,縮短了關卡制作的難度以及周期。
下面再說一下《秦時明月世界》定制管線中關于Grab Pass的定制過程。
首先,Unity本身的Grab Pass是按照傳統(tǒng)的形式,如果是相同的名字命名,它會使用同一張Grab Pass,如果是不同的名字命名,它會分別使用不同的Grab Pass。如果是項目中使用不慎,就會出現(xiàn)很多Grab Pass造成的一些RT的爆增,導致內存爆增的問題。《秦時明月世界》這里面采用了單一的控制方式,可以有效地緩解這種處理方式。
首先,它會收集需求,Grab Pass的Renderer,禁止繪制,然后計算每個Renderer的可見性,判斷需要哪些RT,同時根據(jù)具體的需求,我們可以使用全分辨率的RT,也可以使用不同情況縮小屏幕空間的一些RT動作,這樣可以有效地控制RT的分辨率,節(jié)約內存。
在整個繪制階段,利用Unity提供的CommandBuffer,我們可以快速地截取屏幕,并且在特定的階段會去使用這個Grab截圖,然后進行特殊的效果。
?
下面介紹一下我們《秦時明月世界》中定制管線的后處理流程。
《秦時明月世界》使用的是Unity為我們提供的后處理組件,傳統(tǒng)的后處理組件整個的流程是這樣的形式,首先通過一個屏幕空間的分辨率,經(jīng)過若干個后處理的流程,進入到一個Unity提供的UberShader,然后再經(jīng)過FinalPass整個的階段,為了兼容傳統(tǒng)的后處理流程OnRender Image的方法來保證傳統(tǒng)的全屏處理繪制顯示,最終再繪制到屏幕上,然后融合到UI相機顯示到屏幕上。
?
可以看到整個過程會產生大量的RT切換,相當于硬件FBO的切換,在Tile GPU上會造成額外的內存的回讀,性能大量地消耗,而且至少會有兩到三次的全屏幕的操作,這樣會大大地影響整體的性能,使得后處理階段會是一個在《秦時明月世界》項目中非常重要的性能消耗點。
基于這個,我們優(yōu)化了后處理的流程,降低了它整個渲染的過程。首先,我們去掉了UberShader的過程,將UberShader及FinalPass和繪制屏幕這個過程三個全屏的操作統(tǒng)一到一起,同時又將傳統(tǒng)的基于屏幕空間的繪制移除掉,這樣就可以保證我們后處理的流程僅僅使用標準的一個全屏幕處理就可以直接與UI相機融合,繪制到屏幕上,不會造成額外的FBO的切換,也不會造成額外的FBO的回讀操作,大大降低了內存中的回讀以及全屏幕的運算操作,從而提升了后處理本身的效率。
?
接下來講《秦時明月世界》的定制渲染管線的多光源。
Unity中多光源的處理方式在傳統(tǒng)的渲染管線中使用的是ForwardAdd這種方式,采用多個Pass繪制多個光源。《秦時明月世界》采用了單Pass多光源的方式繪制。
首先,使用靜態(tài)分支去優(yōu)化設備,同時控制內存,使用光照的位置來定義光源類型,Shader中也會根據(jù)區(qū)域進行劃分。《秦時明月世界》中對于多光源主要使用的是點光源和聚光燈,整個過程會采用單Pass多光源的方式繪制。基于這種方式,就可以減少ForwardAdd增加Pass的這種情況,也就是說在多光源的情況下整個繪制過程,一個Pass會把所有燈光繪制到這個物體上,可以保證我們在對于DC特別敏感的設備上不會使用多Pass這種方式來增加系統(tǒng)的消耗,提升整個多光源效果上整體性能的開銷。
?
給大家展示一下效果。主要展示的是我們在使用多光源的同時使用的一個單Pass多光源的效果。可以看到在技能釋放的過程中,在技能相關的位置會有多個點光源去影響整個場景以及人物。但同時多個光源又是因為一個Pass來繪制的,會大大節(jié)省性能。
?
這是一個色相分離效果。
?
這個是后處理的邊緣模糊和多點旋轉的效果。
?
這是一個幀混的效果。
?
這是《秦時明月世界》中輕功的色相分離以及徑向模糊的后處理展示。
?
這是水面效果的展示。這里面就用到了剛才提到的Grab Pass,用來做折射處理。
?
感謝大家!
總結
以上是生活随笔為你收集整理的《秦时明月世界》手游如何用Unity定制化渲染管线?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【风农翻译】开始画像素画 #8
- 下一篇: 腾讯光子《黎明觉醒》技术美术负责人:如何