在上一篇文章中,我們闡述了PowerVR光線追蹤API的基本知識,包括場景生成和光線處理。在本文中,我們將展示如何有效地使用這些光線來呈現(xiàn)不同的效果,并將其結(jié)果與光柵化進(jìn)行對比。
以下視頻即光線工廠——我們最新的混合渲染演示:
混合光線追蹤可以更好地進(jìn)行渲染
像素陰影最基本的要素便是識別環(huán)境:它所處的位置、光線來自哪里,光線是否會受到其他曲面的阻礙或折返回來等等。光柵化則不會確定以上信息,因?yàn)槊總€三角形都是獨(dú)立存在的。在某種程度上,有一些很顯然的方法來應(yīng)對這個問題,但這些方法過于復(fù)雜或效率低下,往往導(dǎo)致圖像質(zhì)量不佳。而另一方面,光線跟蹤非常擅長獲悉周邊的環(huán)境,但由于計算更復(fù)雜,所以速度會很慢?;旌箱秩酒鲃t結(jié)合了光柵化的速度和光線跟蹤的環(huán)境感知能力。在使用光線追蹤計算曲面的光線和反射時,它已將G緩沖區(qū)光柵化,呈現(xiàn)出所有可視的曲面。
陰影
在光柵化中處理陰影非常不直觀,需要相當(dāng)多的運(yùn)算:需要從每條光線的視角渲染場景,再存儲在紋理中,隨后在光照階段再次投射。更糟糕的是,這樣做未必會產(chǎn)生優(yōu)質(zhì)的圖像質(zhì)量:那些陰影很容易混疊(因?yàn)楣饩€所視的像素與攝像頭所視的像素并不對應(yīng)),或堵塞(因?yàn)榘涤百N圖的紋素存儲的是單一的深度值,但卻可以覆蓋大部分區(qū)域。此外,大多數(shù)光柵化需要支持專門的陰影貼圖“類型“,如立方體貼圖陰影(用于無方向性的光線),或級聯(lián)陰影貼圖(用于大型戶外場景),而這大大增加了渲染器的復(fù)雜性。
在光線追蹤器中,單一的代碼路徑可以處理所有的陰影場景。更重要的是,投影過程簡單直觀,與光線從曲面投向光源及檢查光線是否受阻一樣。PowerVR光線跟蹤架構(gòu)呈現(xiàn)了快速的“試探”光線,其用于檢測光線投射方向的幾何圖形,這也使得它們特別適合進(jìn)行有效的陰影渲染。
柵格化陰影(左)呈現(xiàn)的是塊狀效應(yīng),而光線追蹤陰影(右)則像素精準(zhǔn)
像素良好的陰影十分清晰,但卻沒有吸引力,所以下一步便是繪制一個漂亮的軟半影。同樣,這個過程非常直觀且具有邏輯性:半影是由曲面的光源產(chǎn)生,而非無限小的點(diǎn)。我們并非將單一的光線投射至某個點(diǎn),而是將一些光線投射至光曲面上的某個隨機(jī)點(diǎn),再取平均結(jié)果。曲面越大,半影則越大。那么,為了獲得更優(yōu)質(zhì)的圖像,我們便需要更多的光線。
進(jìn)行了恰當(dāng)?shù)陌胗疤幚淼墓饩€跟蹤陰影(右)
顯然,這個方法非常簡潔,也非常容易實(shí)現(xiàn)。使用更先進(jìn)的方法當(dāng)然可以獲得更好的效果,這一點(diǎn)我們在之前的文章(在游戲引擎中應(yīng)用快速的光線追蹤軟陰影)中有所闡述。
正如半影一樣,要將半透明陰影添加至光柵化中并非易事,特別是當(dāng)它涉及到多層半透明材料。在光線追蹤中,再次展示了一個簡單的過程:當(dāng)陰影光線接觸曲面時,檢查這個曲面的不透明程度,并相應(yīng)地降低光線密度。
標(biāo)準(zhǔn)的光線追蹤陰影(上)VS高級的光線追蹤陰影將雨傘當(dāng)作一個半透明材料(下)
環(huán)境光遮蔽
環(huán)境光遮蔽(AO)可以被看作是一個無限的穹頂光的陰影,因此可以以非常相似的方式實(shí)現(xiàn)軟陰影。將光線穿過半球曲面,若沒有幾何圖形,一些光線便會積聚。由于整個半球的光線將被集成,因此在選擇抽樣方法時則務(wù)必注意。在這個特定的例子中,我們在余弦葉取樣器中獲取一個2D霍爾頓序列,它將生成賞心悅目的可視效果。
光柵化屏幕空間環(huán)境光遮蔽(上)和光線追蹤環(huán)境光遮蔽(下)
環(huán)境光遮蔽并非僅通過光柵化便可以輕易完成。當(dāng)前的方法通常需要其近似于屏幕空間,并忽視第三個維度,或者用體積呈現(xiàn)一個場景,并在著色器中模擬光線追蹤。
光柵化屏幕空間環(huán)境光遮蔽(左),和光線追蹤環(huán)境光遮蔽(右)
全局光照
全局光照(GI)本質(zhì)上與環(huán)境光遮蔽相對,但它通過一個簡單AO渲染器擴(kuò)展便可以實(shí)現(xiàn)。當(dāng)光線沒有接觸任何事物時,GI并非積累光線,而是積累其接觸到的曲面上的光線。這意味著,快速“試探”光線不能再使用,必須用全局光線替換,以此找出最近的曲面交線,然后再評估這個點(diǎn)上的光線。
在這個特定的例子中,我們將同時使用單反射GI和AO。盡管在物理上而言,使用GI和AO有些不確定性,但就審美角度而言,其生成圖像的質(zhì)量令人賞心悅目,幾乎接近預(yù)渲染時的質(zhì)量。
簡單的光線追蹤全局光照(下)增加了橙色的曲面反射光
使系統(tǒng)支持發(fā)光曲面并非難事,且任何幾何圖形都可以轉(zhuǎn)化為區(qū)域光,并被完美地集成至場景中。而光柵化仍然沒有解決區(qū)域光的問題:它們通常局限于簡單的形狀,且不能投射陰影,故而在現(xiàn)實(shí)場景中難以使用。
曲面當(dāng)作區(qū)域光投射軟陰影
優(yōu)化
相比完全使用光線追蹤渲染器,使用混合方法可以節(jié)省大量的計算工作。大型的場景若要生成復(fù)雜的效果仍是造價昂貴,但我們必須盡一切努力來實(shí)現(xiàn)最佳的性能。
我們的光線工廠演示以每秒30幀,1080p在PowerVR GR6500 GPU上運(yùn)行,每秒可以投射1億條光線。不同的光線追蹤效果所需的成本如下所示:
意想不到的是,環(huán)境光遮蔽比單一的陰影成本更高,因?yàn)樗枰罅康墓饩€。同樣,當(dāng)AO取樣器擴(kuò)展到支持全局光照,同樣需要額外的計算來識別最近的曲面及評估光線。
時間超級采樣
在大多數(shù)情況下,兩個連續(xù)的幀極其相似:有些曲面可能有稍許移動,但仍然是按先前渲染的相同的曲面。從一幀轉(zhuǎn)入下一幀時,成本較高的陰影操作則可以被再次使用,只要像素及其先前的位置之間可以進(jìn)行映射。這種方法在實(shí)時圖像中非常通用,已經(jīng)被用于改善抗鋸齒、SSAO、屏幕反光等。通過將光線分布至幾幀中,它可以減少每幀所需光線的數(shù)量。
時間超級采樣只需要訪問前一幀和每像素運(yùn)動向量。由于基于拼貼的PowerVR GPU架構(gòu),通過使用像素本地存儲擴(kuò)展,渲染這些額外的運(yùn)動向量便非常有效,且無需消耗額外的帶寬。
環(huán)境光遮蔽使用每像素單一光線渲染(左),每像素單一光線使用時間超級采樣(右)
盡管大幅提高了光線質(zhì)量(或減少了光線數(shù)量,取決于你的視角),它不會造成時間假象。例如,在移動對象后可以看到陰影痕跡。
更好的場景管理
場景層次架構(gòu)生成(SHG)是大量的光線追蹤發(fā)生的地方:頂點(diǎn)著色器在場景幾何圖形上運(yùn)行,生成的三角形存儲在加速結(jié)構(gòu)中,從而使得實(shí)時光線追蹤成為可能。隨著場景的發(fā)展,這個任務(wù)可能需要大量的幀渲染時間:
簡單的SHG生成使主要的渲染停止
所幸,SHG可以與主渲染平行運(yùn)行。這意味著,當(dāng)前的一幀完成渲染時,下一幀的幾何圖形已經(jīng)準(zhǔn)備就緒,這就大大降低了幀處理時間。然而,這需要場景具有多個緩沖,這樣,修改某個緩沖時,另一個緩沖可以進(jìn)行渲染。想要開發(fā)Vulkan或優(yōu)化OpenGL渲染器則必須采用以上類似的方法。
雙緩沖場景處理和平行場景層次架構(gòu)生成,幀速率提升
在光線工廠演示中,平行運(yùn)行的場景層次架構(gòu)生成大約減少8ms幀時間,而我們的性能調(diào)優(yōu)應(yīng)用程序顯示,其所生成的三角形數(shù)量可以輕松翻倍,且不影響性能。
我們還可以進(jìn)一步改善場景層次結(jié)構(gòu)生成的性能:靜態(tài)幾何圖形可以被預(yù)先計算,并被預(yù)先緩存,隨后在運(yùn)行時間與動態(tài)元素合并。這一點(diǎn)通常非常有用,因?yàn)榄h(huán)境大多是靜態(tài)的。
總結(jié)
通過使用PowerVR光線追蹤器可以大幅改善實(shí)時3D圖像的質(zhì)量:光線效果可以更精準(zhǔn)(如陰影、環(huán)境光遮蔽)。但更重要的是,光線追蹤可以突破當(dāng)前渲染器的限制,允許生成如實(shí)時全局光照這類的新效果。最后,光線追蹤不僅僅允許更好的光照效果,也可以處理傳統(tǒng)引擎中的復(fù)雜的問題,從而使渲染器的工作更加簡易。
原文鏈接: https://imgtec.com/blog/hybrid-rendering-for-real-time-lighting/
評論