本篇文章的題目采用的是“啟示”而不是“變革”,這是因為移動端的游戲引擎依然在遵循自己的策略慢慢地實現(xiàn)全局光線追蹤。移動端游戲社區(qū)都想實現(xiàn)光線追蹤,但是存在不可抗力的原因:硬件的性能不夠,不能滿足幀率的要求。因此,Imagination一直在致力優(yōu)化移動端,并推出了PowerVR光線追蹤硬件IP核。
?
本篇文章主要分為兩部分,分別從不同的角度進(jìn)行闡述。第一部分討論的是美術(shù)相關(guān)的問題以及游戲場景資源的生成:幾何、顏色、紋理、表面屬性和光源。第二部分介紹的是將軟件工程集成到虛幻引擎(UE)中來,并采用Imagination PowerVR GR6500硬件平臺以及Vulkan驅(qū)動中擴(kuò)展的光線追蹤API。
第一部分:美術(shù)(游戲美工抱怨:“我只是想讓它漂亮些,為什么會變成這樣?”)
毫無疑問,游戲制作美工都想要實現(xiàn)光線追蹤效果(提供準(zhǔn)確的反射、折射和投射陰影的一鍵式解決方案)。因為這將會使他們將更多的精力放在美學(xué)研究方面,而不是專注于游戲資源的適應(yīng)技巧從而使得游戲場景顯得更加的真實。
我們注意到,光線追蹤的解決方法類似于反射探測、屏幕空間和平面反射外加額外的眩光效果,但是它們都有明顯的光學(xué)限制。在屏幕空間內(nèi),物體的反射是不可見的,物體的背面也是沒有反射效果的。平面反射通常是采用比較生硬的方式來實現(xiàn),比如通過巧妙的重新定位相機(jī)對場景進(jìn)行重新渲染。實際上這種方法只適用于平面,而且在移動端由于性能的限制這個功能通常會被禁止。
游戲美工通常花費(fèi)大量的時間定位和測試反射探測節(jié)點(diǎn)以及其它光發(fā)射節(jié)點(diǎn),為的是讓場景更具視覺沖擊力。當(dāng)然,如果游戲是打算在移動設(shè)備上運(yùn)行,那么我們不得不限制反射探測節(jié)點(diǎn)的數(shù)量,因為每一幀都需要將它們重新生成來涵蓋所有的動畫。這種解決方法通常需要成百上千個小時來進(jìn)行處理以達(dá)到預(yù)期的效果。當(dāng)然,這些都需要我們?nèi)斯崟r查看處理過程以確保所有游戲資源預(yù)期進(jìn)行處理。
可以驗證的是光線追蹤的陰影更加精確而且不需要過多的密集型處理,結(jié)果就是更低的功耗以及性能的提升。目前創(chuàng)建非光線追蹤的陰影緩存比較復(fù)雜而且很容易出現(xiàn)各種問題。從根本上講,它們是深度圖像文件,從光點(diǎn)角度來看它們表示的是距離。由于實際文件大小的限制它們只占用游戲場景的一小部分。一般用于靜態(tài)物體,對于動畫對象每一幀都需要重新加載處理,這會增加處理器的負(fù)載。而且如果陰影繼承到顏色屬性中,那么對于透明的物體也是有問題的。適當(dāng)?shù)哪:幱伴L度能夠增加真實感,但是不通過光線追蹤或者動態(tài)深度測量是不可能實現(xiàn)的。如果渲染引擎采用全局光線追蹤就不會出現(xiàn)這些問題。(注:在寫這篇文章時我們還沒有將混合單光線軟陰影算法添加到虛幻引擎支持中)。為了能夠顯著提升投射陰影的表現(xiàn)力,Imagination的光線追蹤方案會區(qū)別對待陰影光線,尤其那些不透明的物體。
游戲場景的其他方面,如管道、材質(zhì)、模型、光源和物體表面都可以通過光線追蹤引擎實現(xiàn)流線型的表現(xiàn)效果。現(xiàn)在游戲美工社區(qū)特別期待移動端硬件能夠支持光線追蹤。盡管,即使有了光線追蹤特性也還有很多工作要做,但是花費(fèi)更多時間使游戲場景變得更加漂亮也是值得的。
?
?
第二部分:科學(xué)(真正重要的來了)
這個項目的目標(biāo)是集成光線追蹤特性,使之確保光線跟蹤效果與現(xiàn)有的光柵效應(yīng)同等重要。舉個例子,當(dāng)材料的表面屬性需要反射效果,那么這個材料的著色器需要編譯來投射合適的反射光線。我們付出了很多努力來尊重虛幻引擎(UE)的架構(gòu),以便所有效果都能夠放在一起很好的展示出來。這意味著你的游戲可以選擇光線追蹤反射搭配映射陰影在同一個場景同一時刻存在。為了能夠?qū)崿F(xiàn)這個功能,引擎需要編譯材料著色器的光線追蹤變量,當(dāng)二次光線在場景內(nèi)交織時依然能夠保持正常。
虛幻4引擎支持桌面版Linux和OpenGL 3.x和4.x已經(jīng)有一段時間了,2015年年底的時候,初始版本又增加了對Vulkan 1.0的支持,但是只兼容Windows和安卓系統(tǒng),2016年2月在MWC大會上Epic公司正式發(fā)布了這個消息,并展示了一個名為ProtoStar的Demo運(yùn)行在三星Galaxy S7手機(jī)上。現(xiàn)在來自虛幻4引擎Gihub社區(qū)的Yaakuro實現(xiàn)了引擎與Vulkan同時運(yùn)行在桌面版Linux系統(tǒng)上,并且在英偉達(dá)桌面版GPU上進(jìn)行了展示。
2016年5月,我們啟動了一個項目,將虛幻4引擎運(yùn)行在PowerVR GR6500系統(tǒng)上,起初是在常規(guī)光柵模式下,但不久后增加l了對光線追蹤功能的支持。由于虛幻4引擎代碼庫的架構(gòu),默認(rèn)僅在移動平臺上支持OpenGL ES 2.x和3.x,且在Linux系統(tǒng)只支持桌面版OpenGL 4.x。同時我們也決定擴(kuò)展Vulkan跨平臺API,使得在桌面版Linux主機(jī)上支持我們的“移動端”GPU。
我們只花了幾周時間就熟悉了Yaakuro所做的工作,并根據(jù)當(dāng)前虛幻4引擎代碼庫對其項目進(jìn)行了更新,實現(xiàn)了在英偉達(dá)GPU上移植Vulkan API。從次以后就可以簡單地實現(xiàn)Vulkan設(shè)備管理切換為GR6500板卡,并使用Imagination開發(fā)的Vulkan驅(qū)動程序,只需要對SDL庫做些微小的調(diào)整就可以讓引擎好像是在X window上渲染,實際上是在渲染評估系統(tǒng)HDMI的輸出畫面。
項目停頓了一段時間,因為我們已經(jīng)非常熟悉虛幻4引擎的代碼庫,并且與在UK的工程師協(xié)作完成和穩(wěn)定了Vulkan驅(qū)動程序,同時我們開始計劃使用Vulkan光線追蹤擴(kuò)展API向虛幻引擎中添加基礎(chǔ)的光線追蹤功能。
最初階段涉及到調(diào)節(jié)引擎的渲染傳遞機(jī)制來執(zhí)行光線場景的構(gòu)建操作,使用Vulkan光線追蹤擴(kuò)展API非常簡單,因為修改的代碼非常類似Vulkan現(xiàn)在的光柵渲染,使用開始/結(jié)束命令包裝渲染次序,使用帶有頂點(diǎn)和光線著色器的Vulkan管道對象取代常規(guī)的光柵著色器。我們還可以重復(fù)使用現(xiàn)在的“靜態(tài)網(wǎng)格”幾何圖形來繪制一個環(huán)路,適當(dāng)調(diào)整來移除投影碎片的可見性檢查,我們希望所有的幾何體都能夠被渲染到光線追蹤的層次結(jié)構(gòu)中。
我們能夠準(zhǔn)確的使用與光柵渲染相同的頂點(diǎn)著色器(有引擎編譯生成),僅需要改變一些參數(shù)值來控制頂點(diǎn)的轉(zhuǎn)換使得頂點(diǎn)的輸出在世界場景中而不是投影的屏幕空間中。起初,我們使用手寫的光線著色器,編寫自己的代碼實現(xiàn)控制,僅要求頂點(diǎn)屬性結(jié)構(gòu)能夠匹配頂點(diǎn)著色器(這種方式只需要在引擎編譯之前解析頂點(diǎn)著色器的GLSL資源)。
這讓我們能夠一次性的完成場景搭建和光線追蹤渲染,我們增加了基本顏色、光源、陰影和反射屬性,最后一步是展示測試,在游戲畫面中光線追蹤圖形應(yīng)該疊加在常規(guī)的光柵圖形上面。
下一步就是讓引擎能夠根據(jù)實際的場景材料自己生成光線著色器,采用材料和著色器跨編譯器機(jī)制使得我們你能夠增加其他著色器類型,盡管引擎只是將它們作為第二像素(碎片)著色器,從USF著色器文件資源衍生而來(USF資源定義了常規(guī)的像素著色器)。然后Vulkan RHI層會將二次USF像素著色器轉(zhuǎn)換為GLSL,將GLSL資源代碼轉(zhuǎn)換為光線著色器,最后會將其編譯到SPIR-V資源文件中。在引擎的高層次中的材料代碼會創(chuàng)建像素著色器的二次副本(也就是說相關(guān)參數(shù)是相同的),然后將它傳遞給RHI,因為它只接收二次像素著色器實際上我們這里給它傳遞的是光線著色器副本。最后與像素著色器的綁定方式相似,它會準(zhǔn)確的綁定所有相同的材質(zhì)資源。
雖然是一個全局的光線追蹤渲染器,但是實際上它是常規(guī)像素著色器行為的復(fù)制或者說幾乎相同,包括映射/CSM陰影、反射探針反射以及所有相同的光源變體(光源圖、方向光、可選的點(diǎn)光源等)。
使用USF內(nèi)置的功能來調(diào)節(jié)引擎的HLSL解析器一般會將光線追蹤的一些細(xì)節(jié)(輸入和輸出光線管理、與光線著色器綁定的參數(shù))隱藏起來。這使得USF著色器代碼包含了更多功能,如檢查輸入光線的深度(用于光線反射調(diào)節(jié))、發(fā)射反射和陰影光線以及統(tǒng)計光線追蹤累積緩存中的最終顏色值,不使用額外非常的語法。這些調(diào)用的函數(shù)會轉(zhuǎn)換為GLSL,而且這些函數(shù)的實現(xiàn)會添加到GLSL代碼中,作為從像素著色器向光線著色器的轉(zhuǎn)換代碼。
使用一些預(yù)處理程序,可以使用USF的像素著色器代碼快速搭建出基本的光線著色器,僅需要添加10行代碼和調(diào)節(jié),就可以實現(xiàn)光線追蹤反射和圖像深度統(tǒng)計。其他部分重組的USF代碼需要添加光線追蹤陰影,只需要將光源計算放到陰影計算之前,這樣我們就可以實現(xiàn)動態(tài)切換是選擇光柵(映射/CSM查找)還是光線追蹤(遞歸統(tǒng)計)陰影效果。
展示的這個Demo是在常規(guī)引擎說明場景基礎(chǔ)上擴(kuò)展的一個版本,引擎可以自由切換為光柵模式還是光柵追蹤模式。盡管在光線追蹤模式下,我們也可以在光柵和光線追蹤陰影之間選擇以及顏色取樣和光線追蹤反射效果。我們還增加了其他一些材料用于在渲染模式下每種材料表面參數(shù)設(shè)置。舉個例子,因為這個初始版本的光線追蹤反射實現(xiàn)方案不支持光滑(或模糊)反射,我們展示了如何設(shè)置使得一些材料可以繼續(xù)使用模糊探測反射,其他材料使用光線追蹤實現(xiàn)真正的光滑反射效果。
最后我們演示了光線追蹤的靈活性,提供可選的攝像機(jī)模型和第四種渲染模式,即使用真正的360度球面透鏡渲染整個場景。
后面的工作我們會涉及到動態(tài)幾何圖形,支持點(diǎn)光源,重新實現(xiàn)和優(yōu)化我們開發(fā)的混合單射線軟陰影算法。
本篇文章作者Will Anielewicz,高級軟件工程師(PowerVR,Imagination); Simon Eves,高級軟件工程師(PowerVR,Imagination)。
Will Anielewicz簡介
Will自從1967年就開始與計算機(jī)打交道,在1974年獲得了紐約大學(xué)計算機(jī)科學(xué)榮譽(yù)學(xué)位,同時具有多學(xué)科碩士學(xué)位,包括美術(shù)、計算機(jī)科學(xué)和心理學(xué)。曾被授權(quán)開發(fā)一個計算機(jī)圖形鋼琴,并在現(xiàn)場演唱會上演出。1976年在加拿大多倫多藝術(shù)畫廊,Will作為嘉賓參加了世界上第一次計算機(jī)圖形藝術(shù)展覽。在1982年Will作為第一個員工參與了瑪雅三維軟件的開發(fā)。自從那以后,Will參與了14部特效電影(例如星際前戰(zhàn):幽靈的威脅)和多個商業(yè)獲獎廣告的創(chuàng)作。現(xiàn)在Will在Imagination科技作為一名高級軟件工程師,研究和開發(fā)PowerVR光線追蹤。他的目標(biāo)是推動計算機(jī)圖形學(xué)的發(fā)展,尤其在計算機(jī)視覺和增強(qiáng)現(xiàn)實方面。
Simon Eves簡介
Simon是Imagination科技的一名高級圖形學(xué)工程師,在舊金山分部已經(jīng)工作了六年。之前他從事了長達(dá)十五年的軟件開發(fā)和電影和電視視覺效果技術(shù)美工工作,工作地點(diǎn)遍布倫敦和灣區(qū)。在收購Caustic圖形公司后,Simon作為第一名員工參與了硬件光線追蹤架構(gòu)的開發(fā),也就是現(xiàn)在的PowerVR Wizard架構(gòu)的前身。
英文鏈接: https://www.imgtec.com/blog/unreal-engine-and-the-ray-tracing-revelation/
聲明:
本文為原創(chuàng)文章,轉(zhuǎn)載需注明作者、出處及原文鏈接,否則,本網(wǎng)站將保留追究其法律責(zé)任的權(quán)利
評論