彭浩宇,廖文詩(shī),陳 超
(重慶科技學(xué)院智能技術(shù)與工程學(xué)院,重慶 401331)
渲染的研究目標(biāo)是對(duì)渲染方程進(jìn)行近似求解,近似求解所得到的結(jié)果分為有偏差和無(wú)偏差,因此也產(chǎn)生了兩種不同的研究方向。 其中,無(wú)偏差的近似求解被稱(chēng)作離線(xiàn)渲染,有偏差的近似求解被稱(chēng)作實(shí)時(shí)渲染。在實(shí)時(shí)渲染領(lǐng)域常用封裝好的圖形API 或圖形引擎實(shí)現(xiàn),將離線(xiàn)渲染算法結(jié)合至實(shí)時(shí)渲染下的圖形API 中,是真實(shí)感圖形學(xué)目前一個(gè)熱門(mén)的研究方向。
離線(xiàn)渲染中最常使用的全局光照模型最早起源于1968 年,Arthur[1]在他的文章中提出了光線(xiàn)投射(Ray Casting)算法,其具體思路是從攝像機(jī)出發(fā),連接屏幕上的一個(gè)像素構(gòu)成光線(xiàn),與場(chǎng)景中第一個(gè)擋住光線(xiàn)的物體相交,它表面的顏色即為像素的顏色。 由于該算法沒(méi)有將反射、折射等多光源反饋信息吸收進(jìn)來(lái),于是在1979 年,Whitted[2]提出了經(jīng)典的光線(xiàn)追蹤方法,在光線(xiàn)投射的基礎(chǔ)上讓光線(xiàn)與物體繼續(xù)交互,進(jìn)一步產(chǎn)生反射、折射以及散射等效果,直到光線(xiàn)強(qiáng)度減弱到一定程度或光線(xiàn)逃逸出場(chǎng)景。 該算法極大地提高了光照模型的真實(shí)感,為后續(xù)真實(shí)感圖形學(xué)的研究奠定了基礎(chǔ)。
實(shí)時(shí)渲染中需要考慮到渲染的實(shí)時(shí)性,受制于硬件的性能,離線(xiàn)渲染常用的眾多算法無(wú)法運(yùn)用在實(shí)時(shí)渲染領(lǐng)域當(dāng)中。 同時(shí),實(shí)時(shí)渲染的操作都是基于光柵化的前提下對(duì)光照方程進(jìn)行求解,并且將場(chǎng)景內(nèi)的間接光照放在預(yù)計(jì)算模塊,所以很難實(shí)時(shí)的渲染出高精度的光照模型。 但實(shí)時(shí)渲染的應(yīng)用多數(shù)存在于游戲公司當(dāng)中,如國(guó)外的Epic 和EA,國(guó)內(nèi)的網(wǎng)易、米哈游等。在游戲開(kāi)發(fā)領(lǐng)域,常常使用例如Unity3D 之類(lèi)的游戲引擎進(jìn)行實(shí)時(shí)渲染,一方面降低了圖形程序的編程難度,同時(shí)也封裝了接觸底層圖形所需要控制的內(nèi)存管理系統(tǒng)。
圖形API 的本質(zhì)是一套對(duì)接硬件底層的圖形封裝接口函數(shù)庫(kù),目的是直接調(diào)用顯卡驅(qū)動(dòng)使顯卡能夠渲染出用戶(hù)可見(jiàn)的應(yīng)用程序。 圖形程序員無(wú)須考慮底層的硬件需求,如寄存器的操作,可以直接使用特定平臺(tái)的API 進(jìn)行圖形編程。 常見(jiàn)的圖形API 包含:多平臺(tái)的OpenGL,最初由 Silicon Graphics Inc(SGI)發(fā)布,后由非盈利團(tuán)隊(duì)Khronos 維護(hù);微軟發(fā)布的DirectX 僅限于Windows 環(huán)境下,目前已推出DirectX12,在英偉達(dá)顯卡的加持下支持高效率的實(shí)時(shí)光線(xiàn)追蹤[3];基于OpenGL 的OpenGL ES,最初為了嵌入式設(shè)備而推出,現(xiàn)大量用于安卓平臺(tái);基于OpenGL ES 的WebGL,主要用于網(wǎng)頁(yè) Web 端;蘋(píng)果公司推出的 Metal,在 WWDC 2015 上,蘋(píng)果首次提出了Metal,目的是一套圖形接口可用于蘋(píng)果的多設(shè)備平臺(tái)(包含iPhone,iPad,Mac,Apple TV,Apple Watch),打造無(wú)縫切換的生態(tài)體驗(yàn)。在WWDC2020 上,蘋(píng)果也提出了實(shí)時(shí)光線(xiàn)追蹤的概念,并且支持Metal 的使用。
光線(xiàn)追蹤算法是真實(shí)感圖形學(xué)當(dāng)中最常用的算法之一,它用于模擬每一道光線(xiàn)從而能產(chǎn)生反射、柔化陰影和間接光照等效果。 光線(xiàn)追蹤的原理是模擬一個(gè)攝像機(jī),通過(guò)攝像機(jī)發(fā)射的光源射線(xiàn)來(lái)獲取場(chǎng)景信息,每一束光線(xiàn)從攝像機(jī)發(fā)射到場(chǎng)景內(nèi),發(fā)射的光線(xiàn)與場(chǎng)景內(nèi)的幾何物體相交從而得到的交點(diǎn)均代表光線(xiàn)經(jīng)過(guò)一個(gè)表面后反彈的結(jié)果,光線(xiàn)反彈的數(shù)量和方向則決定了物體的外觀。 同時(shí),光線(xiàn)在經(jīng)過(guò)反彈操作后可以生成額外的光線(xiàn),能夠進(jìn)一步渲染更加逼真的場(chǎng)景(見(jiàn)圖1)。
圖1 光線(xiàn)追蹤原理
在Metal Performance Shaders(MPS)框架下,首先啟動(dòng)一個(gè)內(nèi)核函數(shù)用于生成光線(xiàn)的初始集,并且將這些數(shù)據(jù)集寫(xiě)入光線(xiàn)緩沖區(qū)內(nèi),再利用MPSRayIntersector類(lèi)使光線(xiàn)與場(chǎng)景相交產(chǎn)生交點(diǎn)。 其中,Metal 采用求交器記錄這些交點(diǎn),通過(guò)求交器將求交結(jié)果寫(xiě)入下一個(gè)內(nèi)存緩沖區(qū),之后便可以啟用著色器內(nèi)核函數(shù)讀取求交數(shù)據(jù)并進(jìn)行著色操作。 額外的光線(xiàn)可以寫(xiě)回光線(xiàn)緩沖區(qū),再反復(fù)循環(huán)這兩個(gè)內(nèi)核函數(shù)以模擬光線(xiàn)反彈,最后輸出場(chǎng)景圖像。
通過(guò)圖2 可以看出,在MPS 框架內(nèi),會(huì)把代碼拆分為單獨(dú)的內(nèi)核函數(shù),同時(shí)還需要經(jīng)由內(nèi)存?zhèn)鬟f光線(xiàn)和求交數(shù)據(jù)。 但是在Metal 實(shí)時(shí)光線(xiàn)追蹤框架下,求交器的對(duì)象可以直接在著色語(yǔ)言中使用,通過(guò)將圖2 上方的內(nèi)核函數(shù)模塊組合成一個(gè)Metal 內(nèi)核函數(shù),并且不需要將光線(xiàn)傳遞的光源信息在內(nèi)核函數(shù)之間傳輸,省去了光線(xiàn)及求交數(shù)據(jù)的緩沖區(qū),即不需要靠讀寫(xiě)內(nèi)存來(lái)傳遞光線(xiàn)和求交數(shù)據(jù)。 圖2 上方的外層循環(huán)便可以用圖3 當(dāng)中Metal 內(nèi)核函數(shù)的簡(jiǎn)單循環(huán)來(lái)代替。
圖2 基礎(chǔ)光線(xiàn)追蹤MPS
圖3 實(shí)時(shí)光線(xiàn)追蹤
以WWDC20 為例,本文在MacOS 操作系統(tǒng) Metal和Xcode13 開(kāi)發(fā)環(huán)境下對(duì)基礎(chǔ)的光照模型進(jìn)行了實(shí)驗(yàn)。 實(shí)驗(yàn)對(duì)基礎(chǔ)光照模型采取了9 種不同類(lèi)型的光照模擬,每種光照條件下所渲染出的模型都具有不同的渲染效果,并且渲染所需的時(shí)間極短及所渲染的效果精度極高,從而驗(yàn)證了本設(shè)計(jì)能夠很好地完成實(shí)時(shí)光線(xiàn)追蹤模擬。
該實(shí)驗(yàn)由基礎(chǔ)模型至基本完成渲染的時(shí)間不足0.5 秒,通過(guò)對(duì)比渲染了5 分鐘的離線(xiàn)渲染模型,即得出能夠以較短的時(shí)間實(shí)時(shí)地渲染出接近高精度光照模型的結(jié)論。 通過(guò)實(shí)驗(yàn)的結(jié)果可以看出,基于Metal 實(shí)時(shí)光線(xiàn)追蹤下的模型場(chǎng)景具備較高真實(shí)度的還原效果。