曹心怡 趙建軍
(北京電影學院,北京 100088)
《阿凡達》以來,數(shù)字3D電影的發(fā)行給制片方帶來了高額的票房,數(shù)字3D電影技術(shù)因此發(fā)展迅速。即使如此,3D電影制作過程中仍然要受到諸多因素的制約,導致拍攝時和成片后的效果不甚理想。Unity是當下使用最為廣泛的3D引擎之一,其強大的功能為立體拍攝提供了得天獨厚的支持,也為立體電影的虛擬制作提供了解決方案。
現(xiàn)代立體電影的發(fā)展過程中,拍攝畫面從2K到4K,攝影機從雙機平行放置到垂直90度立體支架放置,進而發(fā)展到便攜式雙鏡頭一體機。立體電影對于拍攝條件要求較高,且DI工藝中增加了立體調(diào)整環(huán)節(jié)。傳統(tǒng)3D技術(shù)與Unity引擎和虛擬制作技術(shù)的結(jié)合,產(chǎn)生了像《獅子王》這種完全虛擬拍攝的立體電影。相比傳統(tǒng)3D電影,在Unity引擎中進行虛擬拍攝擁有以下優(yōu)點:
(1)傳統(tǒng)3D電影受到攝影機和支架物理尺寸的制約,導致基線不能無限大小,拍攝一些特殊景別的鏡頭時非常受限。即使使用分光鏡解決了雙機光軸間距問題,也有很多局限性:損失2/3檔光圈,縮小景深;工藝質(zhì)量不夠高造成反射面殘影;系統(tǒng)結(jié)構(gòu)復雜導致雙機穩(wěn)定性大打折扣等。Unity中的攝像機為虛擬攝像機,沒有機身或支架尺寸的限制,基線理論上可以是無限大小。
(2)傳統(tǒng)3D電影為常規(guī)的24幀格式,幀率不足造成的運動模糊會大大降低3D效果的品質(zhì)。而Unity引擎中優(yōu)化得當,幀率可以達到60幀甚至120幀。
(3)傳統(tǒng)3D電影需要攝影師盡力追求更大的景深,以便增加左右兩眼觀看到兩組畫面的區(qū)分度和影像清晰度,以營造立體效果。Unity中的攝像機可以實現(xiàn)無限大景深,為立體虛擬空間提供足夠清晰明亮的視覺線索。
(4)傳統(tǒng)3D電影后期DI成本高,處理復雜。Unity封裝的可編程渲染流水線能夠讓開發(fā)者更輕松地管理渲染設(shè)置,著色器(Shader)則能控制渲染細節(jié),從而實現(xiàn)特定的渲染效果。
目前,利用Unity引擎創(chuàng)作立體影像的方法,有基于裸眼3D顯示裝置的顯示系統(tǒng),也有針對特定3D顯示器的適配指南,立體效果優(yōu)秀,但是普遍存在的問題就是成本較高、較難實施。
上述的兩個Unity 立體影像方案都對硬件有較高的要求。而本文提出的方案則是利用渲染紋理(Render Texture)和Shader對左右攝像機輸出的圖像進行分別處理,實現(xiàn)方法成本低廉,實現(xiàn)簡單,立體效果較好,擁有較強的可配置性。本方案的研究目標主要包括兩部分:一是紅青立體影像的基本功能實現(xiàn),二是對于該方案的效果測試。
其中,紅青立體影像的基本功能實現(xiàn)需要在Unity場景中建立攝像機,并把攝像機的渲染目標設(shè)置成渲染紋理。還需要了解紅青立體影像的原理,并在Shader中實現(xiàn)左右機影像不同通道的分別渲染與合并工作。
對于該方案的效果測試需要完成零平面位置的調(diào)整對于立體效果的測試、攝像機橫向運動對于立體效果的測試。
Unity 3D是Unity Technologies公司開發(fā)的一款3D引擎,因其強大的跨平臺特性、絢麗的3D渲染效果以及自由豐富的人機交互功能而聞名出眾。其跨平臺開發(fā)特性可以節(jié)省開發(fā)時間,省去開發(fā)者在不同平臺之間的移植開發(fā)工作。
新版《獅子王》就是使用Unity引擎進行虛擬制作,雖然現(xiàn)場有傳統(tǒng)的電影設(shè)備,包括三腳架、dolly車、云臺、調(diào)焦遙控器、搖臂、無人機,但是這些設(shè)備要么是被重新編程,像軌道和伸縮炮,用來確定攝像機的位置;要么是用Opti Track進行追蹤,例如手持或斯坦尼康。真正用于拍攝的都是Unity內(nèi)部的虛擬攝像機。最終實際使用的拍攝場景并不大,只有約21×12米,并且攝制組只用了其中大約1/3的空間就拍攝了《獅子王》的大部分內(nèi)容。
使用Unity寫Shader的一個好處在于,在Unity中,渲染管線被高度封裝,用戶不再需要親力親為手動計算一些值(通常是重復性的矩陣運算)。同時,它提供了很多內(nèi)置的參數(shù),能夠讓用戶很方便地調(diào)用,實現(xiàn)特定的渲染效果。
人眼在觀看自然物體時,兩眼是從不同角度觀看物體,從而在左右眼視網(wǎng)膜上形成稍有差異的像,然后再經(jīng)過大腦分析融合形成立體視覺。3D拍攝時也是利用雙目視差來形成立體感的。
本項目選擇使用的是紅青立體3D方法,通過紅色和青色的色彩濾鏡對每個眼睛的圖像進行編碼,當通過用顏色“編碼”的彩色濾色片眼鏡時,對應每只眼睛的圖像都能夠到達預期的眼睛,從而在大腦皮層中合成立體圖像。
紅青立體方案有以下優(yōu)點:
(1)相比較濾色片更便宜的紅藍眼鏡,紅青眼鏡能夠更好地還原色彩,尤其是膚色。
(2)相比較偏振立體方案,不需要額外的顯示設(shè)備,普通顯示器即可觀看,成本更加低廉。
(3)相比較平行視圖(side-by-side)的立體圖案,可以擁有更大的視場角,而不會造成觀看者的不適。
基于以上方面,本項目使用紅青立體3D方法作為使用Unity輸出立體影像的方案。
著色器(Shader)是GPU渲染流水線中的一個環(huán)節(jié),用來對三維物體進行著色處理、光影計算和紋理顏色呈現(xiàn)等。
圖1是GPU的渲染流水線實現(xiàn),顏色表示了不同階段的可配置性或可編程性:綠色表示該流水線階段是完全可編程控制的,黃色表示該流水線階段可以配置但不是可編程的,藍色表示該流水線階段是由GPU固定實現(xiàn)的,開發(fā)者沒有任何控制權(quán)。實線表示該Shader必須由開發(fā)者編程實現(xiàn),虛線表示該Shader是可選的。
圖1 GPU的渲染流水線實現(xiàn)
著色器中包括頂點著色器(Vertex Shader)和片元著色器(Fragment Shader)兩個部分,它們是GPU渲染流水線中完全可編程控制的部分。
在沒有渲染紋理的時候,一個攝像機的渲染結(jié)果會輸出到顏色緩沖中,并顯示到屏幕上?,F(xiàn)代的GPU允許我們把整個三維場景渲染到一個中間緩沖中,即渲染目標紋理(Render Target Texture,RTT),而不是傳統(tǒng)的幀緩沖或后備緩沖(back buffer)。Unity為渲染目標紋理定義了一種專門的紋理類型——渲染紋理(Render Texture)。渲染紋理可以看成是一種特殊的紋理類型,它在引擎運行時可以實時更新。
針對得到的渲染紋理,本方案將利用Shader做如下處理:首先對輸入的兩張渲染紋理進行采樣得到紋素值(Texel);然后把兩張圖片分別采樣得到的紋素值,RGB通道分離處理;最后,取其中一張圖片的紅(R)通道和另一張圖片的青(GB)通道,合成為一張新的紋理進行輸出。
圖2 方案結(jié)構(gòu)圖
本文使用的方案,首先在需要處理的Unity場景里面架設(shè)2臺虛擬攝像機,再把兩臺攝像機的渲染目標設(shè)置成渲染紋理。把這兩張渲染紋理作為輸入,用Shader對它們分別做處理之后,輸出到另一個材質(zhì),作為最終的輸出。圖2為方案的結(jié)構(gòu)圖。
本方案由兩部分構(gòu)成,一是Unity場景的搭建和前期工作的準備,二是在Shader中處理獲得的渲染紋理,并輸出最終效果。其中在Unity中的準備工作是紅青影像方案實施的核心部分,下文將從3個角度詳解本方案。
3.2.1 場景搭建
測試場景需要保證實驗的正常進行,首先必須是三維場景,其次要有足夠的景深,遠、中、近景都有被攝物體分布。
最終確定的場景如圖3。
圖3 場景斜向俯瞰圖
圖4 Scene窗口攝像機景別
序號①處為遠處的山峰,②為中景的石頭,③為近景且在畫面邊緣的植物。最終確定的攝像機景別如圖4。
3.2.2 攝像機搭建
在圖4中確定的攝像機位置建立一個空物體,這個位置就是兩臺攝像機的中心所在的位置。把兩臺攝像機作為此空物體的子物體,位置、旋轉(zhuǎn)全部歸零。此時,這兩臺攝像機的視角均和圖4中所呈現(xiàn)的一致。
為了模擬立體攝像機的雙目視差,把兩臺攝像機分別向左右兩邊移動0.3單位,攝像機搭建完成。
目前兩臺攝像機均為平行拍攝,為了方便確定零平面的位置,還需要在Scene視圖中顯示出兩臺攝像機的主光軸。用兩個x和y方向縮放均為0的正方體(Cube)分別作為左右兩臺攝像機的子物體,同樣把位置、旋轉(zhuǎn)全部歸零,這樣轉(zhuǎn)動攝像機的時候這條兩線也會跟著顯示。用這種方法可以得到主光軸匯聚的位置。把主光軸匯聚的位置放在中景的石頭上面。
圖5 Scene窗口主光軸匯聚在中景的石頭上
3.2.3 創(chuàng)建渲染紋理
在Project目錄下創(chuàng)建一個渲染紋理,然后把左攝像機的渲染目標設(shè)置成該渲染紋理,這樣一來該攝像機的渲染結(jié)果就會實時更新到渲染紋理中,而不會顯示到屏幕上。使用這種方法,我們還可以選擇渲染紋理的分辨率、濾波模式等紋理屬性。右攝像機也做同樣操作。
因為渲染紋理經(jīng)過處理后最終要輸出到屏幕上作為輸出結(jié)果,因此大小要盡可能大。理想情況下,紋理可以是非正方形的,但是長寬的大小應該是2的冪。如果使用了非2的冪(Non Power of Two,NPOT)的紋理,那么這些紋理往往會占用更多的內(nèi)存空間,GPU讀取該紋理的速度也會有所下降。出于性能和空間的考慮,把紋理大小設(shè)置成1024×1024。
把兩個渲染紋理分別賦給兩個Quad,并排這兩個Quad,用最終輸出的攝像機拍攝side-by-side版本,測試雙目立體效果。
圖6 Game窗口Side-by-side測試輸出
3.2.4 利用著色器(Shader)處理渲染紋理
著色器的可編程部分為頂點著色器和片元著色器。
在頂點著色器中并沒有經(jīng)過太復雜的處理。首先把頂點坐標從模型空間轉(zhuǎn)換到剪裁空間中。雖然使用了兩張紋理,但是它們不存在紋理坐標上的變化操作,所以它們共用同一組紋理坐標。
在片元著色器中,因為輸出的是攝像機拍到的圖像,因此不用對法線方向和光照方向進行處理,否則會影響到輸出面片的光照效果。使用Cg的tex2D函數(shù)對輸入的渲染紋理進行采樣。它的第一個參數(shù)是需要被采樣的紋理,第二個參數(shù)是一個float2類型的紋理坐標,它將返回計算得到的紋素值。
對兩張渲染紋理做兩次采樣,其中左眼的紋理只輸出紋素值的紅色(R)通道,右眼的紋理只輸出紋素值的青色(GB)通道。最后返回的顏色則是把它們混合在一起,形成新的彩色圖像。關(guān)鍵代碼如下:
fixed RedChannel=tex2D(_Left Tex,i.uv).r;
fixed2 CyanChannel=tex2D(_Right Tex,i.uv).gb;
return fixed4(RedChannel,CyanChannel,1.0);
分別調(diào)整左右攝像機的旋轉(zhuǎn)參數(shù),測試平行拍攝和匯聚在中景的石頭上的效果。兩者的輸出如圖7所示。
圖7 左圖:雙機平行拍攝,右圖:匯聚在中景的石頭上
圖7左圖所有的物體都在負空間(即屏幕之前),很容易視覺疲勞。小恐龍左右像差過大,令觀察者很難融像,努力融像之后視覺非常疲憊。在Photoshop中測量負像差為42像素,圖片尺寸為1024像素,遠遠超過相差標準。
圖7右圖以中景為分界線,遠景在正空間,近景的小恐龍和植物在負空間,雖然立體感覺不如左圖強烈,但是沒有任何不適。
將腳本Translating.cs拖拽給攝像機對,使兩個攝像機能夠一致往返不斷運動。
調(diào)節(jié)攝像機對橫向移動的速度,實驗證明在幀率刷新極限范圍內(nèi),速度增大都不會影響立體效果。因為Unity虛擬攝像機雙機影像能夠做到完全的幀同步,且攝像機畫面是逐幀刷新的,沒有果凍效應。
在上文中,提出了基于Unity游戲引擎的紅青立體影像的實現(xiàn)方案,給出了此方案的研究內(nèi)容和目標。然后詳細介紹了Unity場景中準備工作應該如何進行,以及如何利用Shader對渲染紋理進行處理。最后簡單測試了本方案的立體效果。
本方案還有許多工作需要進一步實施。首先是攝像機光軸可以使用gizmos.drawline函數(shù)在Scene視圖中畫出來。然后是利用屏幕后處理給屏幕影像加運動模糊,測試運動模糊對于影像的立體效果有無影響;給輸出壓一個暗角,改善邊緣的顯示效果。最后是測試鏡面和透明物體對于立體空間的影響。