在最新發(fā)布的一篇文章中,我曾提到維護(hù)虛擬現(xiàn)實(shí)系統(tǒng)“真實(shí)感”的重要性。而高幀率(60、90或120 Hz,取決于頭戴式顯示器(HMD)的最大刷新率)的渲染應(yīng)用程序與光子運(yùn)動(dòng)低延遲是實(shí)現(xiàn)“真實(shí)感”的重要部分
在本文中,我將闡述如何使用OVR_multiview擴(kuò)展減少渲染VR應(yīng)用程序所需的CPU和GPU功耗。
不使用OVR_multiview的渲染
在標(biāo)準(zhǔn)的優(yōu)化VR應(yīng)用程序中,場(chǎng)景將在幀緩沖區(qū)對(duì)象(FBO)中進(jìn)行兩次渲染——一次渲染左眼圖像,另一次渲染右眼圖像。要進(jìn)行渲染,應(yīng)用程序需進(jìn)行以下操作:
?Left eye 左眼圖像
在FBO左邊部分設(shè)置視口
使用左眼的攝像機(jī)投影矩陣在場(chǎng)景中繪制所有對(duì)象
?Right eye 右眼圖像
在FBO右邊部分設(shè)置視口
使用右眼的攝像機(jī)投影矩陣在場(chǎng)景中繪制所有對(duì)象
渲染每個(gè)矩陣的場(chǎng)景時(shí),由于HMD透鏡,F(xiàn)BO對(duì)象會(huì)由桶形失真修正至枕形失真。
在這個(gè)方案中,應(yīng)用程序必須提交兩個(gè)幾乎相同的GL call數(shù)據(jù)流,而兩次渲染唯一的區(qū)別是應(yīng)用到頂點(diǎn)時(shí)要進(jìn)行矩陣轉(zhuǎn)換。每矩陣都需提交調(diào)用實(shí)則浪費(fèi)時(shí)間。同時(shí),GPU驅(qū)動(dòng)程序也需要花費(fèi)時(shí)間來(lái)驗(yàn)證API調(diào)用并且每矩陣均生成GPU命令緩沖區(qū),而一個(gè)簡(jiǎn)單的共享命令緩沖區(qū)便可以完成這些工作。
OVR_multiview
有了OVR_multiview擴(kuò)展(及分層的OVR_multiview2和OVR_multiview_multisampled_render_to_texture擴(kuò)展),應(yīng)用程序可以綁定一個(gè)結(jié)構(gòu)數(shù)組至FBO,并對(duì)每個(gè)元素進(jìn)行實(shí)例繪制。這樣,圖像驅(qū)動(dòng)程序便會(huì)準(zhǔn)備一個(gè)GPU命令緩沖區(qū),并在每次實(shí)例渲染時(shí)重新啟用該緩沖區(qū)。當(dāng)擴(kuò)展程序處于激活狀態(tài)時(shí),則可以在頂點(diǎn)著色器中訪問(wèn)gl_ViewID_OVR內(nèi)置來(lái)確定需要渲染的元素。
由于是基于拼貼的GPU架構(gòu),每實(shí)例中必須進(jìn)行拼貼。拼貼過(guò)程完成后便執(zhí)行每元素的像素渲染任務(wù)。
OVR_multiview:優(yōu)化繪圖提交過(guò)程
使用OVR_multiview一個(gè)較為簡(jiǎn)單的例子是創(chuàng)建一個(gè)結(jié)構(gòu)數(shù)組,該數(shù)組由兩個(gè)分別代表左眼圖像和右眼圖像的元素組成。對(duì)于每一幀,應(yīng)用程序可以通過(guò)以下步驟完成渲染:
?綁定FBO(附上結(jié)構(gòu)數(shù)組)
?將變換矩陣數(shù)組統(tǒng)一傳輸至著色器中
數(shù)組包含兩個(gè)元素——兩個(gè)變換矩陣分別用于左眼圖像和右眼圖像
?在場(chǎng)景中繪制對(duì)象
?在頂點(diǎn)著色程序執(zhí)行時(shí),使用gl_ViewID_OVR確定哪些矩陣用于轉(zhuǎn)換
通過(guò)這個(gè)簡(jiǎn)單的轉(zhuǎn)換,應(yīng)用程序可以減少一半需要提交給驅(qū)動(dòng)的OpenGL調(diào)用。
OVR_multiview:減少片段處理
用于拓寬用戶視野的透鏡是沉浸式VR系統(tǒng)的重要組成部分。為解決透鏡引起的枕形失真,必須在圖形顯示之前應(yīng)用桶形失真。
不過(guò),現(xiàn)代GPU設(shè)計(jì)的初衷并不僅是渲染桶失真圖像。VR應(yīng)用程序必須在第一層時(shí)渲染非失真圖像,然后在第二層進(jìn)行桶形失真。但這樣,第一層渲染便過(guò)多消耗了GPU周期及帶寬的紋素色素,而可供桶形圖像外部區(qū)域使用的則非常少,在第二層渲染中桶形圖像外部區(qū)域的紋素和像素密度則非常高。
如上圖中所示,可以使用OVR_multiview將渲染細(xì)分為可以更好地表示桶形圖像像素密度的區(qū)域。實(shí)現(xiàn)該方法一個(gè)簡(jiǎn)單的例子是,每矩陣在桶形圖像中間渲染一個(gè)高分辨率且窄視野的圖像,在桶形圖像外部區(qū)域渲染一個(gè)分辨率較低且寬視野的圖像。桶形失真?zhèn)鬏斊陂g,片段著色器可以在桶形圖像內(nèi)基于像素坐標(biāo)將高分辨率和低分辨率圖像混合在一起。
在視野狹窄的渲染中,全分辨率圖像占整個(gè)場(chǎng)景的25%,而寬視野渲染的分辨率則為一半(全分辨率的25%),GPU只需要對(duì)全分辨率渲染一半的像素進(jìn)行著色——極大減少了片段著色器的計(jì)算量和相關(guān)帶寬。當(dāng)然,具體的節(jié)省量取決于沒(méi)有偽影的情況下視野到底有多窄。
總結(jié)
通過(guò)OVR_multiview擴(kuò)展及對(duì)一些簡(jiǎn)單的應(yīng)用程序進(jìn)行更改,VR應(yīng)用程序便可以更有效地將處理任務(wù)傳輸至圖像驅(qū)動(dòng)器,并通過(guò)減少所需渲染的像素從而降低GPU的功耗。想了解更多Imagination如何優(yōu)化VR渲染的資訊,我強(qiáng)烈推薦克里斯汀·波茨赫所寫(xiě)的有關(guān)使用帶渲染減少異步時(shí)間彎曲延遲的文章。
原文鏈接:
https://imgtec.com/blog/optimizing-vr-renderers-with-ovr_multiview/
評(píng)論