4月24日,Unreal Open Day 2017在上海召開。會(huì)上,Epic games引擎工程師李文磊發(fā)表《開發(fā)者遇到的典型美術(shù)相關(guān)問題回顧》的演講,他總結(jié)了日常工作中開發(fā)者常遇的幾個(gè)問題,并指出了背后的原因和解決方案。 以下內(nèi)容由VR陀螺整理: 透明亂序問題: 首先,我想談透明排序的問題。 透明的問題非常多,一個(gè)是關(guān)于透明貼圖和透明材質(zhì)的問題。它的表現(xiàn)大家都應(yīng)該遇到過,就是透明物體和透明物體之間,它的渲染有的時(shí)候在前,有的時(shí)候在后,根據(jù)移動(dòng)會(huì)不斷的變化。 它所產(chǎn)生的原因也很簡(jiǎn)單:透明物體不會(huì)被渲染到深度通道,沒有深度就無法正確的排序,特別是象素級(jí)別的正確的排序,UE4可以在物體的層級(jí)進(jìn)行強(qiáng)制的排序。透明的排序問題基本上是沒有什么解決方法,只能通過一些迂回的方式去解決。 比如說水面上有霧效的例子,很簡(jiǎn)單的方式就是讓煙霧在水面以下不化。先把這些霧渲染到所有的東西前面,做了一個(gè)簡(jiǎn)單的shader,可以簡(jiǎn)單在shader里提取拿到水面的高度。然后在shader里,做一些交叉的地方的漸變,因?yàn)檫@些煙效果會(huì)更好一些,從而達(dá)到一個(gè)模擬解決排序的問題。 但在很多情況下沒有那么簡(jiǎn)單,水面是一個(gè)平面。比如很復(fù)雜的一些透明模型怎么來做前后,一個(gè)簡(jiǎn)單的方式我們可以拿到透明物體的dcustomdepth和另一個(gè)比較來決定。 復(fù)雜的球形也可以用同樣的道理,我們把球里面用shader變成黑色,球外面變成一個(gè)白色,用這個(gè)做一個(gè)mask做各種各樣的效果。這種效果應(yīng)用到實(shí)例上經(jīng)常是一個(gè)透明的人。 透明效率問題 第二個(gè)問題是透明效率,也就是重復(fù)采樣效率的渲染開銷問題。它包含兩個(gè)方面原因:一是shader的復(fù)雜度,二是數(shù)量,數(shù)量越多越復(fù)雜。從這兩點(diǎn)我們就可以很容易去判斷解決方法,減少shader的復(fù)雜度以及減少重疊的幾率。 光照模式的半透明和光照模式的(),他們相差還是非常大的,所以對(duì)于一些蒸汽不需要光照的我們就讓它自發(fā)光,還可以提供一個(gè)自動(dòng)的功能,能夠把自動(dòng)判斷貼圖的邊緣,把面片盡量的包裹貼圖的mask,這樣使得面片的面積很小化,這樣的作用就是讓重疊的幾率減小,可以減少開銷。 另外一個(gè)在某些比較模糊或者說這種效果我們不需要太高的分辨率畫面,可以把透明物體的分辨率降低。例如,將畫面降成一半,透明的開銷大大的降低,畫面看起來稍微模糊,但能接受,有些時(shí)候可以用這樣的方式大大減少透明物的開銷。 透明的物體和背景之間的融合問題 透明物體和背景在Unreal有多種的融合方式。首先是一個(gè)Additive的效果,就是加上去的效果,經(jīng)常用一些增量的效果。 比如閃電,我們經(jīng)常遇到就是背景非常亮的情況,貼圖的細(xì)節(jié)就會(huì)丟失,白色的地方基本上沒有細(xì)節(jié)了,黑色的地方跟我原來的貼圖是非常接近的,灰色的地方就是一半一半。用半透明的混合模式,可以很好的把需要透明的地方展現(xiàn)出來,但是半透明對(duì)于阿爾法通道的要求非常高,通道做得不好很有可能不是想得到的效果。而且白色的地方可能會(huì)產(chǎn)生黑邊,黑色背景的一邊又可能會(huì)產(chǎn)生白邊,就對(duì)通道的要求非常非常高,摳出來的效果不是很好。 其次是Alpha Composite混合模式,無非是用透明通道來控制背景被add的量,它的好處是什么?大家可以看到,在亮度相對(duì)add是可以把握一定的細(xì)節(jié),暗部也可以完全保留。不需要不錯(cuò)的阿爾法通道,只要黑白灰,用它的RGB的通道就可以產(chǎn)生非常好的效果。 用半透明來模擬Alpha Composite,基本上用背景的顏色做一個(gè)加法和一個(gè)本身的顏色做混合,對(duì)于特效美術(shù)來說,有些時(shí)候可以考慮去使用這種混合模式來進(jìn)行制作。 漏光的問題: 漏光有很多原因產(chǎn)生的,靜態(tài)的很簡(jiǎn)單,大部分是精度不夠高等等。我想說動(dòng)態(tài)的漏光,這邊舉幾個(gè)實(shí)例,一個(gè)是影子沒有貼合投射物,第二距離遠(yuǎn)了以后沒有陰影,動(dòng)態(tài)的角色和靜態(tài)的場(chǎng)景燈光不匹配,第三個(gè)是間接光的漏光,反射也是間接光的一種。 動(dòng)態(tài)影子沒有貼合投射物主要是三個(gè)原因,一是影子本身的精度低,二是影子的投射面積太大,三是影子偏移太大。具體來看解決方法,首先我們把引擎里影子的禁止調(diào)到很高,UI里就可以找到,有一個(gè)叫做SG的group,打成4,是電音品質(zhì),所有下面的參數(shù)就會(huì)用默認(rèn)的這套參數(shù)。應(yīng)用了這套參數(shù)以后還沒達(dá)到很好的效果,特別是對(duì)于影視公司制作非常高的品質(zhì)。 接下來針對(duì)不同的投影的性質(zhì)做一些調(diào)整來提高應(yīng)用本身的精度,對(duì)于CSM Shadow主要就是陰影的距離和陰影的層級(jí)數(shù)。 大家可以看到默認(rèn)情況下調(diào)整這兩個(gè)參數(shù)以后的對(duì)比,還有一個(gè)perpixel Shadow,這個(gè)是不一樣的,需要調(diào)整,一個(gè)主要是用來增加影子的精度的,它的意思就是Unreal里面對(duì)于動(dòng)態(tài)影子有一個(gè)很小分辨率和很大分辨率,根據(jù)距離引擎會(huì)自動(dòng)的調(diào)某一級(jí)的分辨率來顯示,比如我在200米引擎調(diào)用256的精度,我這個(gè)設(shè)高了以后引擎可以調(diào)用更高的精度,很小分辨率設(shè)高,就是強(qiáng)制使用更高的分辨率。接下來針對(duì)不同的投影的性質(zhì)做一些調(diào)整來提高應(yīng)用本身的精度,對(duì)于CSM Shadow主要就是陰影的距離和陰影的層級(jí)數(shù)。 還有一個(gè)perpixel Shadow,這個(gè)是不一樣的,需要這些參數(shù)來進(jìn)行調(diào)整,一個(gè)主要是用來增加影子的精度的,它的意思就是Unreal里面對(duì)于動(dòng)態(tài)影子有一個(gè)很小分辨率和很大分辨率,根據(jù)距離引擎會(huì)自動(dòng)的調(diào)某一級(jí)的分辨率來顯示,比如我在200米引擎調(diào)用256的精度,我這個(gè)設(shè)高了以后引擎可以調(diào)用更高的精度,很小分辨率設(shè)高,就是強(qiáng)制使用更高的分辨率。 除了剛才說到的地方影子本身精度,還有影子投影的面積,對(duì)于解決這個(gè)面積不同的光源有不同的方式。 對(duì)于探照燈、聚光燈它的張角直接影響投射的面積,張角越小投射面積越小,所以同樣的精度可以大大提高影子的精度。對(duì)于點(diǎn)光源主要是一個(gè)距離,距離越近投射面積越小,精度越高。 除此之外還有其他的方式,比如說陰影的一些濾鏡,類似于銳化的功能,一些新的接觸陰影,比如這個(gè)接觸陰影是接近屏幕的技術(shù),非常小的細(xì)節(jié)沒有足夠的精度表現(xiàn)可以用這種進(jìn)度陰影打開表現(xiàn)。 另一個(gè)問題是距離拉遠(yuǎn)以后沒有影子,這個(gè)默認(rèn)情況下是引擎的一種優(yōu)化行為,首先影子精度射到影視級(jí),但是這里不是所有跟距離有關(guān),這些參數(shù)是跟距離有關(guān)的,Shadow和vedio就是定位多小的距離可以被顯示,比如我設(shè)成64,Shadow小于64的精度我就不顯示了,所以需要更遠(yuǎn)的地方顯示Shadow,就把數(shù)字設(shè)成16或者更小。 對(duì)于不同的應(yīng)用類型我們用不同的方式來解決遠(yuǎn)距離無陰影的問題。另外一個(gè)經(jīng)常碰到的就是動(dòng)態(tài)物體和靜態(tài)物體的用靜態(tài)燈光不能很好的銜接。 第三個(gè)問題是間接光的漏光,包括反射。在很新的引擎版本中場(chǎng)景物體加了一個(gè)Distance Field WindirectShadow,產(chǎn)生一個(gè)間接光的遮蔽,不像以前做了一個(gè)AO放再一個(gè)Distance里,是對(duì)所有的光產(chǎn)生屏蔽,所以產(chǎn)生的結(jié)果不會(huì)所有的地方這個(gè)物體看上去都是灰灰的,勾了一層自陰影的根據(jù),而是只會(huì)在一些陰影中產(chǎn)生。 殘影問題: 因?yàn)樵赨E里我們默認(rèn)使用的是一種TA的方式,它的里基本上就是在渲染的時(shí)候把每個(gè)做一些小的抖動(dòng),在很后合成,細(xì)節(jié)量特別大就會(huì)產(chǎn)生瑕疵,貼圖的Mipmap是為了自動(dòng)的減少分辨率而產(chǎn)生貼圖級(jí)別的抗拒,但是有些可能細(xì)節(jié)量太大也會(huì)產(chǎn)生這些問題。 知道原因解決起來就很簡(jiǎn)單了,把反向貼圖強(qiáng)度適當(dāng)?shù)慕档停琈ipmap可以用不同的算法,比如我們提供了很多的算法,比如這種情況我用一些比較模糊的算法來減少。比如SSR反射以及SSAO這些其實(shí)在TA情況都會(huì)加劇這種問題,所以一旦遇到這些問題,大家可以一個(gè)一個(gè)的分析,主要是我提到的前面三個(gè),其他的大家可以察看一下。 模型動(dòng)畫的法線問題: 特別是做面部動(dòng)畫的時(shí)候,這一看就知道是在動(dòng)畫以后它的法線產(chǎn)生的問題,因?yàn)榉ň€在沒有閉眼是朝上的,閉眼以后還是朝上的,這是引擎默認(rèn)的行為。 目前的解決方法比較簡(jiǎn)單的就是我們可以使用SkinCache,把信息放到Skincache里面,默認(rèn)是不打開的,后期需要改進(jìn)。 另外就是使用一些其他方式,比如用Morph Target,還有Alembic點(diǎn)緩存形式,還有做動(dòng)畫的時(shí)候,盡量的旋轉(zhuǎn)。 外部軟件看和導(dǎo)入到UE4畫面效果不一樣問題: 尤其在動(dòng)畫速度非常快的時(shí)候,有幾禎動(dòng)畫有一個(gè)非常大幅度的動(dòng)作。原因有兩點(diǎn),一個(gè)就是差值與不差值會(huì)產(chǎn)生失禎,第二個(gè)就是關(guān)鍵數(shù)據(jù)丟失。 一個(gè)問題的解決方法是首先我不要差值,把這個(gè)差值關(guān)掉,簡(jiǎn)單地用固定的輸出,比如30禎的Frame也會(huì)產(chǎn)生很終的不差值的效果,可以解決這個(gè)問題。 另外一個(gè)就是關(guān)鍵信息丟失的問題,就是導(dǎo)入到處需要注意,導(dǎo)入的時(shí)候不需要采樣,導(dǎo)入的時(shí)候不要再采樣一次,這些都是有固定的標(biāo)簽的,但是往往會(huì)被大家忽略導(dǎo)致一些問題。 反射球消耗的問題: 反射球的消耗就是反射球的邊緣半透明的地方,我們可以理解成跟透明物體一樣,全部不透明的地方其實(shí)消耗是固定的,所以半透的地方需要注意。 為了證實(shí)這一點(diǎn)我把很大的反射球籠罩到很小的地面上,這塊地面所有的地方都是百分之百的反射,但是我放了28個(gè)反射球,只有一個(gè)反射球的開銷,因?yàn)樗械姆瓷涠际侨客该鳎?.16的毫秒,如果我把這28個(gè)移到旁邊的地方,讓半透明的地方進(jìn)行混合,它就會(huì)大大增加開銷。 首先看怎么減少開銷,減少個(gè)數(shù)有時(shí)候硬度不夠高,所以要避免邊緣的地方的重疊,比如說我用方形的其實(shí)這些邊緣的地方就比較容易避免重疊,因?yàn)榉叫稳菀卓刂七吔?,圓形的比較難,另外可以先放一個(gè)大的,再放幾個(gè)小的,總之你知道原理以后其實(shí)很容易自己去根據(jù)實(shí)際情況避免。 動(dòng)畫序列的輸出問題: 現(xiàn)在很多的開發(fā)者特別是做影射的遇到一個(gè)問題,我很終輸出的畫面需要合成,需要輸出不同序列的禎,很終畫面看過去是其他通道未抗鋸齒的,這個(gè)原因主要是因?yàn)樽筮叺耐ǖ雷隽薚AA,右邊的通道默認(rèn)的輸出是在TAA之前的,所以導(dǎo)致我們的輸出Gbuffer是會(huì)抖動(dòng)的,因?yàn)門AA之前所謂的Gbuffer都做的抖動(dòng),所以之前要做去抖動(dòng)和抗鋸齒,所以TAA之前的數(shù)據(jù)和之后的數(shù)據(jù)我們就合不到一塊了。 簡(jiǎn)單的解決方法就是我們把Gbuffer做一下TAA進(jìn)行輸出,使用后期的材質(zhì)可以讓Gbuffer做Tonemapping。 另外這些PP的材質(zhì)我們可以應(yīng)用到兩個(gè)地方。其實(shí)引擎自帶了一些Buffer,大家可以去那邊找,新的版本里這些都已經(jīng)做了TAA,之前是沒有的,所以這些大家可以去參考一下甚至可以直接提出用,比如說好多我可以直接提出,輸出的時(shí)候可以直接渲染而不會(huì)產(chǎn)生抖動(dòng),可以更好的合成。 以上就是我今天想跟大家過的十個(gè)問題,我還要給出兩個(gè)建議。首先我們有一個(gè)范例場(chǎng)景里面有幾十張地圖,每個(gè)地圖里所有的功能都以實(shí)例的方式列出來,建議大家下載學(xué)習(xí)。第二個(gè)是搜索,但是搜索關(guān)鍵是需要搜索恰當(dāng)?shù)年P(guān)鍵詞, 建議大家能用英文關(guān)鍵詞搜索,基本全球范圍遇到問題的人肯定比國內(nèi)要多。 同時(shí)可以關(guān)注官方的博客和視頻,更新算法及顏色我們會(huì)在上面公布,很后一個(gè)是提問方式,因?yàn)楹苤匾@個(gè)是關(guān)系到解決問題的效率,那么比如說你提供的時(shí)候提供足夠的信息,重新步驟版本號(hào),反復(fù)的實(shí)踐就會(huì)減少。 感謝!
投稿/爆料:tougao@youxituoluo.com
稿件/商務(wù)合作: 六六(微信 13138755620)
加入行業(yè)交流群:六六(微信 13138755620)
元宇宙數(shù)字產(chǎn)業(yè)服務(wù)平臺(tái)
下載「陀螺科技」APP,獲取前沿深度元宇宙訊息