VR互動動畫短片《拾夢老人》的開發經歷

2021-08-02 06:46:30 字數 3373 閱讀 3814

今年筆者在pintastudio,這是我在中科院的同學創立的一家vr電影工作室,我們希望用遊戲引擎實時渲染的方式來表達藝術家的思想。同時,我們製作的vr沉浸式感受也是一種全新的觀影體驗。接下來,我將簡述整個開發的歷程。

vr互動動畫短片《拾夢老人》劇照

立項階段,我們遇到了引擎選擇上的分歧。我們想做的是重量級大作,所以最初的想法是採用乙個重量級引擎。早期做端遊時,我們了解得最多的是cry engine(下稱「ce」)和unreal engine(下稱「ue」)了,這兩個引擎就是引擎界的「西門吹雪」和「葉孤城」,長期霸佔著國外的大作市場。ce這些年在國內推廣不利,所以在最初階段,更多的小夥伴希望用ue來做我們這個電影。我的加入,給團隊帶來了新的選擇—unity。相比前兩個引擎,unity可以說是後起之秀,尤其近3年手遊的興起,才把unity引入大眾的視線。我們主要對ue和unity兩個引擎進行了比較:

在視覺效果上,ue的完成度更高。引擎自帶了比較多的效果如light

propagation、各種volume效果;ue的實時光照用的是經典pbr光照模型,更加接近藝術家們要求的maya效果;ue的shadertree,更是給人一種「屌絲圖形碼工可以退休」的感覺。反觀unity,自帶的效果比較有限(不考慮龐大逆天的assetstore情況下),而且引擎中增加了一些無端端的優化,造成了一些視覺上的bug,遭到一些藝術家的詬病。

效能上,ue沒有對所有模組做全部測試,但是unity經歷了90%以上手遊的考驗,相信可以保證影片的流暢性;同時因為有更多的移動開發案例,所以小勝ue。

操作上,ue更強大的功能必然會導致編譯時間較長;對於喜歡改裝引擎的老司機,修改ue**需要對它所有的模組都熟知;加上是基於c++的開發,程式需要格外小心記憶體、指標等各種問題。再看unity,unity把一些固定**做了封裝,改裝引擎最多只能是對某些模組進行重寫(當然,這樣改裝的結果可能導致效能略低,但是對於我們專案而言,不涉及過多硬體互動),不太容易出現問題;unity是基於c#的開發,程式也相對耐操一些,對於支援vr的pc硬體,記憶體不是最致命的問題,但怕gc太多。

綜上所述,我建議團隊採用unity引擎。儘管後來被幾個大坑坑得鼻青臉腫,但是從專案進度以及結果來看,這個引擎基本上達到了我們想要的效果。

unity引擎本身的畫質相對來說是較為簡樸的,但是對於電影來說,藝術家希望能有一些更豐富的畫面表現。我之前在公司運營團隊寫的一篇文章裡也簡單提過,大家可以參考:

在這裡我們舉個簡單小例子:

如上圖這個光影效果,上面窗戶衍射效果就有很多種實現方法。先對depthmap做邊緣的blur,然後計算光照是一種辦法;直接對render target做區域性的bloom也是一種方法;offscreenrendertarget,渲染一張低解析度的光照貼圖,然後合成回maintarget,也不失為一種好方法。

對於地上陰影的邊緣效果,怎麼實現呢?cookietexture?錯誤,你沒有辦法用cooketexture去解決不規則的陰影衍射,更何況陰影的邊緣顏色是藝術家幻想的。那怎麼辦?其實不難,它是軟陰影演算法的變種,所以,利用概率取樣shadowmap的方法得到陰影邊緣,然後在邊緣地區做顏色疊加即可實現。

我們再舉乙個小例子:

這狗的耳朵是不是有點透明?其實這就是個sss效果,實現方法是:對於乙個表面,沿著視線方向做乙個延伸,取到次表面的光照,再疊加到前表面的顏色上。仔細看unity樹葉的shader(unity內建terrain裡的shader),有個變數backcontrib,是把樹葉背面的顏色疊到前面來,其實也是sss的變種。

我們專案的開發程序充滿艱辛,在此列舉部分,給可能要入坑的同學提個醒:

1. 普通物件standard材質

因為進度原因,我們仍然採用了unity自帶standard裡的pbr光照模型,這個光照模型是經典模型的簡化版,對於大多數渲染物件來說還是可行的。但unity自帶的standardshader在支援半透物件時,就會出現癱瘓的情況。如下圖:

左圖為正確效果,右圖為unitystandard的錯誤效果。這是由於standardshader裡transparent 沒有 z buffer 導致。那麼有同學又會問「我用cut out不就行了麼?」但是cut out是用renderqueue來解決問題的,我希望上面這個腿和靴子來個半透明效果,它就沒辦法實現了。比如下圖這個淡出效果:

此外,unity還有乙個致命的「優化」,就是在opaquequeue之後會把shadowmap給銷毀掉。所以半透明物件無法接受陰影。另外,關於點光源,如果光源範圍內沒有任何物體,unity會把lightmap也「優化」掉。類似這樣的小細節bug比較多,但需求不會因為引擎的bug而減少或者降低標準。乙個坑乙個坑地填起來,也花費了我們相當大的精力。

2. 特效

如果說普通物件的材質是被unity坑了一下,那麼特效就是被vr的sdk給坑得鼻青臉腫。當時我們用的是htc vive的steam vr的sdk。研發完成之後才發現,這個sdk對rendercommand和offscreencamera支援極差(offscreencamera沒有辦法左右眼矯正),也就是說所有的特效必須寫在固定管線裡,比如這種volumetric light。我們需要離線烘焙好shadowmap,然後再前向渲染時,用raytrace去模擬它的attention。

上面兩張圖中,左圖是正確的效果,右圖是steamvr裡可能看到的效果(因為offscreen camera位置沒有經過左右眼矯正,所以位置看上去是偏移的,甚至不在螢幕裡)。

3. 其他

在vr的開發中,相機也是個坑。因為感測器會實時地重置相機位置,所以你沒有辦法去動態改變相機,只能通過反向移動場景的方式來實現相機的動態切換。這也消耗了我們很多的時間來填這個坑。

unity 引擎自帶的渲染模組基本都有些許欠缺,但是近年來隨著compute shader、render command這些介面的提出,給我們引擎開發者提供了很大的可擴充套件空間。正如我多次在uwa技術群(465082844)裡呼籲的:引擎是用來幫助開發者減少工作量的,不是用來完全依靠的。沒有一款引擎能滿足所有專案都通用的需求,所有引擎都需要根據不同的專案來做修改。乙個不會造發動機的人,可以開車,甚至簡單地維修汽車,但是你沒法成為造車場的老司機或者職業賽車手。

附《拾夢老人》1分鐘唯美預告片:

Pixar Shorts 皮克斯動畫短片全集

原創短片 theatrical shorts 16部 安德魯和威利冒險記 頑皮跳跳燈 紅色的夢 錫鐵小兵 小雪人大行動 棋逢敵手 鳥!鳥!鳥!跳跳羊 光桿樂隊 綁架課 魔術師和兔子 暴力雲與送子鸛 晝與夜 月神 藍雨傘之戀 岩漿 動畫長片衍生篇 home entertainment shorts 7...

SVG互動動畫製作

前面我們已經說過了要怎樣製作css3動畫,但是svg動畫一直都沒有時間研究過,正好趁現在有一點時間靜下心來研究一下。一般來說,常見前端動畫實現方案分為三種,css3動畫,html動畫 svg動畫 js動畫或者我們可以稱之為canvas動畫 這裡主要我們是要講解的是svg動畫的實現方法。svg動畫的型...

商業三維動畫短片製作揭秘

1b 01.專案簡介 1b 電視3d系列宣傳片,集廣告宣傳與趣味故事為一體的全三維動畫製作。做cg短片 三維廣告的極好摹本。1b 02.概念設計 1b 業內通用的專業動畫流程前期製作,內容包括根據劇本繪製的動畫場景 角色 道具等的二維設計以及整體動畫風格定位工作,給後面三維製作提供參考。1b 03....