電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>人工智能>汽車組合式儀表盤的渲染優(yōu)化

汽車組合式儀表盤的渲染優(yōu)化

2021-01-26 | pdf | 3.43MB | 次下載 | 2積分

資料介紹

簡介

在幾乎所有現(xiàn)代化汽車上,數(shù)字儀表盤從某種形式上來說屬于標準功能,它們第一次出現(xiàn)是在20世紀80年代,最近幾年它們又重新流行起來,這在很大程度上要歸功于現(xiàn)代GPU更加強大的圖形功能。雖然低配的汽車可能只有里程計算的數(shù)字顯示,但是高端車型則設(shè)計了完全數(shù)字化的儀表盤,包括表盤。

相比傳統(tǒng)的物理顯示,完全數(shù)字化的儀表盤有很多的優(yōu)勢,提供的信息更加的精確、精細甚至更加的清晰。它們可以調(diào)節(jié)并且動態(tài)顯示,準確的顯示駕駛員可能隨時需要看的信息,甚至還可以自定義顯示從而滿足駕駛員的個人喜好。它們的外觀也更加的時尚、現(xiàn)代化,這也是吸引車主的原因。

但是在我們的研究中,我們發(fā)現(xiàn)數(shù)字儀表盤因為幾何圖形的原因設(shè)計得并不是很好,因此無法有效的利用嵌入式GPU的性能,這導(dǎo)致在選擇GPU時做出糟糕的決定,供應(yīng)商錯誤的認為小型的GPU無法勝任這樣的需求從而指定其他硬件。

因此當我們在開發(fā)汽車組合儀表時,我們的主要目的是展示在不影響質(zhì)量的情況下如何可以高效的對汽車儀表進行渲染,例如使用最小型的PowerVR Series8XE內(nèi)核。


在本白皮書中,我們將會列出各種相關(guān)的優(yōu)化技術(shù),目的是確保汽車儀表盤設(shè)計師能夠充分利用他們所采用的硬件。并非所有列出的技術(shù)都在我們開發(fā)儀表盤過程中都使用過,要么是出于設(shè)計原因,要么僅僅是因為達到了性能和質(zhì)量的要求。但是由于某些實際應(yīng)用程序可能會更加的復(fù)雜,我們還介紹了其他一些有用且必要的技術(shù)。

1 組合儀表盤用戶界面(UI)

1.1 表盤的渲染

因為表盤是圓形的,想渲染得很好往往是有一定難度的。要實現(xiàn)完美的圓形通常是向網(wǎng)格中添加更多的三角形(幾何),直到看起來足夠的好為止。這種方法在大型且離散的GPU上運用效率是非常低的,因此,對于在汽車上通常采用的小型嵌入式GPU上是不建議這樣做的,因為這意味著幾乎不可能實現(xiàn)良好的性能。幸好有一些明智的解決方案可以將性能提升到可接受的水平,而無需去降低質(zhì)量。

對于表盤來說,實際上很容易用一個四邊形近似實現(xiàn):alpha透明度可以使其變?yōu)閳A形,而法線貼圖可以實現(xiàn)表面細節(jié)的錯覺:

圖1: 表盤的紋理四邊形和法線貼圖

顯然這是首選的集合方法,但是從透明度利用而言這確是一種浪費:中心是完全不透明的但也要使用透明度,周圍的空白部分是完全透明的也要進行柵格化處理??紤]到法線貼圖在分片階段是非常耗資源的,最好是減少它占用的像素數(shù)。

不用太夸張的縮小幾何圖形而是近似接近表盤形狀幾何,對于這個復(fù)雜幾何形狀我們可以劃分為兩個網(wǎng)格,中央部分是不透明的(有助于減少場景透支),外圍使用alpha混合處理(使其形狀變得更圓)。

圖2: 不透明的中心和透明的外環(huán)(橙色高亮部分)分離設(shè)計

對法線貼圖和切線有了一些了解之后,我們可以做一些事情進一步提高紋理的利用率。本質(zhì)上不是將整個形狀烘焙為紋理,我們僅提取楔形的法線貼圖,然后將其循環(huán)復(fù)制。因為法線貼圖與切線是相對的,切線會隨著幾何形狀旋轉(zhuǎn),從數(shù)學角度證明這是對的,一切都如期望的那樣。

圖3:表盤的最后形狀

圖4:使用可復(fù)制的楔形可以更好的利用紋理資源

在這里使用alpha混合的一個巧妙的副作用是我們可以稍微修飾表盤的邊緣,輕松的去掉鋸齒。下圖是不同MSAA(多重采樣抗鋸齒)情況下的對比:

圖5:三角形數(shù)量越少但質(zhì)量越高

為了證明該技術(shù)在性能上是可行的,我們已經(jīng)在其中一款最小型的GPU(PowerVR GE8300)上進行了測試,并且使用PVRTune工具比較了性能。測試場景包括相同的表盤網(wǎng)格,以1080P的分辨率每幀重復(fù)24次。

圖6: 高質(zhì)量的表盤

下圖來自我們的PVRTune性能分析工具,顯示的是在進行渲染時GPU的時間是如何分布的。下面的方框代表的是執(zhí)行的任務(wù),根據(jù)幀序號用顏色進行了標注。幾何任務(wù)處理的是包括執(zhí)行頂點著色器、剔除表面或屏幕外三角形等產(chǎn)生的幾何圖形。渲染任務(wù)代表的是在像素級別執(zhí)行的操作,例如三角形柵格化、執(zhí)行像素著色器。

圖7:PVRTune工具展示了GPU工作負載的變化情況

正如預(yù)期的那樣,即使GPU相當多的時間用來處理幾何圖形,這對移動端GPU來說也仍然是可以接受的。更令人驚訝的是,將幾何圖形轉(zhuǎn)為像素的時間是19ms。假設(shè)目標幀率要求整個幀在16.6ms以內(nèi),那么該性能水平是不可接受的,尤其考慮到在這種情況下使用的分片著色器是微不足道的,那么問題來了,究竟是什么原因占用了這么長時間呢?

很簡單,光柵化根本無法很好的處理長且細的三角形,從上面的圖表中可以看出:像素處理負載計數(shù)器顯示像素處理時間只有一部分用來執(zhí)行像素著色器,在正常情況下該值預(yù)計將接近100%。然而在這種情況下甚至沒有達到60%,這意味著GPU卡住了做其他事情,大多數(shù)情況下可能很難將形狀不好的幾何圖形柵格化。

使用4X MSAA(多重采樣抗鋸齒)情況變得更糟,應(yīng)用程序性能從50fps下降到30fps,現(xiàn)在以30fps進行全高清(Full-HD)渲染并非不可接受,而且還是很多3D應(yīng)用程序和游戲的標準配置,但是對于重要的汽車組件我們希望實現(xiàn)更高的目標。

現(xiàn)在我們談?wù)剝?yōu)化后的表盤渲染,從外觀上看線框似乎很合理,最后一幀看起來很完美。

圖8:優(yōu)化后的表盤看起來與原始網(wǎng)格相同

然而,正如我們從下圖中看到的,優(yōu)化后它能夠以完全的V向同步60fps來運行,從而為應(yīng)用程序中的其他功能和內(nèi)容提供了空間。

圖9:大大縮短了渲染時間并提高了GPU利用率

有趣的是,通過為GPU提供更高要求的分片著色器,像素渲染任務(wù)現(xiàn)在執(zhí)行得更快——有時候優(yōu)化可能與直覺是相反的。

1.2 文本渲染

正如我們在表盤上發(fā)現(xiàn)的那樣,我們已經(jīng)看到很多測試程序和應(yīng)用使用鑲嵌幾何體來渲染文本,但是原因不清楚。將文本渲染為網(wǎng)格而不是紋理四邊形的唯一理由可能與放大紋理時的過濾質(zhì)量有關(guān)。然而事實證明,這個問題在10年前就可以通過DFF(distance field fonts,距離場字體)技術(shù)解決了,不受傳統(tǒng)的雙線性過濾假象所影響,我們建議采用這項技術(shù)。

圖10:與常規(guī)字體紋理不同DFF可以很好的處理放大倍數(shù)

圖11:DFF看起來與傳統(tǒng)字體略有不同

距離場的一般作法是將距離值映射為不透明值,最基本的解決方案就是一個簡單的閾值:

// 從紋理中提取距離場值
float dist = texture(sdfTexture, uv).a; 
// 將距離轉(zhuǎn)換為alpha值 
float alpha = step(_BaseThreshold, dist); 

通過修改閾值,文本可以變得更粗或更細,這非常有用?!坝查撝怠睂?dǎo)致文本邊緣很硬,這無疑是令人討厭的,而且任何MSAA(多重采樣抗鋸齒)都無法修復(fù):

圖12:“硬閾值”導(dǎo)致文字邊緣很硬

但是,這時可以通過非常簡單且方便的方法進行補救,將“step”函數(shù)換成“smooth step”函數(shù),同時引入一個很小的平滑邊距參數(shù)

float alpha= smoothstep(_BaseThreshold-smoothing, _BaseThreshold+smoothing, dist);

圖13:更加平滑的閾值會使得字體的邊緣更好

雖然這會使放大的文字看起來令人滿意,但放大文字從遠處看起來效果很差,不過可以通過改變平滑值來修復(fù),這與UV坐標的每個像素的倒數(shù)有關(guān),如下所示:

float _BaseThreshold = 0.5;  //  修改此值可使字體變粗
float _Filtering = 16.0;     // 抗鋸齒因子 
float _MinSmoothness = 0.01; //  接近0的值可使文本更清晰
float _MaxSmoothness = 0.4;  // 防止小字體過度模糊
float getFilteringSMoothness(vec2 uv, float intensity, float maxSmoothing) 
{ 
vec2 size = fwidth(uv); 
float smoothingBias = min(max(size.x, size.y)*intensity, maxSmoothing); 
return smoothingBias; 
} 
float getOpacity(vec2 uv) 
{ 
// 從紋理中提取距離場值 
float dist = texture(sdfTexture, uv).a; 
// 將距離轉(zhuǎn)換為Alpha值
float smoothing = _MinSmoothness + getFilteringSMoothness(uv, _Filtering, 
_MaxSmoothness); 
float alpha = smoothstep(_BaseThreshold – smoothing, _BaseThreshold + 
smoothing, dist); 
return alpha; 

這樣可以使圖像比使用標準透明字體和幾何字體這兩種方法都更加的清晰(如圖10),這項技術(shù)不僅可以用于字體,而且適用于任意類型的2D UI元素,此外,這也是面向未來UI的好方法。當使用傳統(tǒng)紋理時,渲染分辨率大幅提高,UI元素的分辨率也要進行類似的提升,這樣才能都有更好的效果,但無論如何放大距離場都可以保持清晰度,因此提高分辨率不是問題,而且不需要其他額外的操作。

在性能方面,相比傳統(tǒng)紋理,DFF性能更好,但它仍然比過度細分的網(wǎng)格渲染的更快。

表1:三種文字渲染方法的渲染時間(單位ms)

在性能測試中,全幾何文字使用3dsMax默認設(shè)置創(chuàng)建(包括基礎(chǔ)的網(wǎng)格優(yōu)化),紋理字體由單個四邊形字符組成,對比結(jié)果如下圖:

圖14:文本渲染對比測試

和表盤一樣,采用簡單的透明度方法而不是復(fù)雜的不透明網(wǎng)格可以顯著的提升性能。基本的紋理可能不適用所有情況,例如一個文本元素被放大,使用DFF方式可以以非常低的代價緩解所有過濾問題。

1.3 使用預(yù)乘的alpha值將CPU的開銷最小化

有時有必要將alpha混合與相加混合一起使用,在我們的案例中就是這樣做的,因為我們有霓虹燈設(shè)計——主要元素使用alpha透明度,周圍的輝光采用相加混合的方式來實現(xiàn)。


傳統(tǒng)上你必須分兩次進行渲染,引入GL狀態(tài)變量,實質(zhì)上讓繪圖調(diào)用次數(shù)翻倍。對于大多數(shù)應(yīng)用來說這不是一個重要的問題,但是該解決方案非常簡單,值得一提的是預(yù)乘alpha值,只需要一個GL狀態(tài)變量就可以創(chuàng)建:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

這在軟件方面是必需的,下一步是創(chuàng)建紋理并利用。

圖15:這個圖標設(shè)計顯示了相加混合和alpha混合特性

RGB通道應(yīng)該包含黑色背景以及輝光的常規(guī)顏色信息,并且alpha層應(yīng)該僅代表圖標的不透明部分。完成后輝光像素會彼此融合,而alpha層會正確覆蓋背景。這意味著現(xiàn)在可以直接渲染大部分UI元素,無需引入其他狀態(tài)或著色器。

2 汽車渲染

隨著儀表盤用戶界面(UI)的發(fā)展,現(xiàn)在是時候解決最具挑戰(zhàn)的部分了:在一款小型的嵌入式GPU上渲染整個車身,并細節(jié)化處理。

精細的汽車模型要可以從不同的角度環(huán)繞查看,駕駛員可以在儀表上看到他們的汽車模型,以及車輛周圍的真實場景,這要借助車載攝像頭、雷達或者激光雷達(LiDAR)。汽車廠商以及車主都希望儀表上顯示的是真實的車輛,越精確越好,而不是簡單的汽車模型。與表盤上的文本一樣,在汽車渲染問題上省去很多的三角形無疑是一種簡便的方式,但是想要獲得更好的效果還有更好的方法,下面我們來詳細介紹一下。

2.1 紋理的一些技巧

鑒于紋理在解決UI幾何瓶頸方面取得的成功,由此推測它們在其他方面也會非常有用。以這個看起來還不錯的汽車內(nèi)飾為例。


但是這是通過簡單的紋理技巧實現(xiàn)的,使得實際的幾何形狀非常簡單。這是怎么實現(xiàn)的呢?這是法線貼圖與烘焙光照的簡單組合,可能需要花費一定的時間來創(chuàng)建,但是帶來的成果確實巨大的。


最明顯的想法是將小的細節(jié)繪制到紋理中。然而這種方法的結(jié)果不足以讓人信服,必須更進一步讓紋理可以控制光照。

2.1.1 法線貼圖

法線貼圖是降低儀表盤渲染成本的便捷方法,不幸的是應(yīng)用到汽車時,我們遇到兩個主要的問題:

① 汽車是三維的(與表盤不一樣,表盤幾乎是平的),如果要讓車體的輪廓非常的光滑,則需要非常密集的網(wǎng)格。

② 法線貼圖在精度上是有限的,包括紋理精度以及深度精度,這會導(dǎo)致紋理外觀并不理想以及出現(xiàn)一些條帶狀的假象。


這是否意味著我們應(yīng)該完全忽略法線貼圖呢?絕對不是!它們在很多地方都非常有用,不僅僅是汽車車身。

例如在儀表案例中,我們將車輪壓縮到其原始尺寸的1.5%,而且沒有明顯的質(zhì)量損失:

圖16:法線貼圖可以大大減少汽車很多部位幾何圖形的數(shù)量

2.1.2 烘焙光照(Baked Lighting)

將高質(zhì)量的網(wǎng)格光照投射到用于渲染的較低質(zhì)量對象上是仿造細節(jié)的另一個好方法。環(huán)境光遮蔽(Ambient Occlusion)通常是首選的照明方式:它完全可以取代動態(tài)光照,甚至可以更好的提升動態(tài)光照,減少幾何圖形的散光程度,在場景中創(chuàng)建讓人舒服的柔和陰影。


環(huán)境光遮蔽(Ambient Occlusion)用于漫反射以及反射效果調(diào)試是非常有效的,而且通常也是非常有用的工具。

圖17:整個汽車的環(huán)境光遮蔽烘焙貼圖

2.1.3 插曲:UV管理

如果將整個車身轉(zhuǎn)換成紋理(大概是帶有環(huán)境光遮蔽的情況),那么需要進行完全的UV展開。但是車體是相對比較大的對象,使用4K紋理囊括所有的細節(jié),這在數(shù)量上是有限制的。好消息是車身是對稱的,而且環(huán)境光遮蔽是完全獨立的。這意味著車身一側(cè)的UV可以與另一面的重合,合并成一個,從而可以節(jié)省大量的紋理空間。如果我們可以提前知道車身的哪部分不需要細致的渲染,我們也可以縮小這部分UV,把空間分給更重要的部分。

圖18:巧妙的打包策略,在UV中將重復(fù)的對稱部分進行重疊(紅色高亮部分)

2.1.4 浮動

還需要渲染最小的按鈕,螺釘和螺栓?好吧,這里有一個非常簡單的方法,可以處理超級小和重復(fù)的細節(jié),而不用創(chuàng)建超大的紋理資源。這個方法通常稱為“浮動”——創(chuàng)建包含很多細節(jié)的紋理組合,在原始網(wǎng)格上渲染一層透明的網(wǎng)格。

圖19:基本的儀表板渲染,3萬個三角形

圖20:采用“浮動”技術(shù)的儀表板:1138個三角形

顯而易見,由于所有細節(jié)都在法線貼圖中模擬,因此優(yōu)化后的版本缺乏深度,除了這個缺點,它與整個模型對于光照和反射的方式是一樣的。

注:在上面的示例中,此優(yōu)化版本的1138個三角形中,超過1000個用于金屬旋鈕,這顯然是浪費,應(yīng)該進一步優(yōu)化。

圖21:僅浮動網(wǎng)格的儀表板

由于這些元素都是重復(fù)和映射的,紋理空間中它們是最小化的,如下使用“浮動”方法的256 x 256分辨率的法線貼圖所示:

圖22:“浮動”的法線貼圖

為了變得更好,從一定距離來看紋理技巧往往非常穩(wěn)定,僅限幾何圖形的系統(tǒng)肯定不是這種情況,如下圖所示,呈現(xiàn)了難以接受的不同級別的鋸齒現(xiàn)象:

圖23:原始的網(wǎng)格 - 沒有MSAA(多重采樣抗鋸齒)處理

從靜止圖像上看起來可能很差,但是在動態(tài)情況下會下降一個數(shù)量級,尤其是當大部分像素以非常激進且分散的方式進行閃爍。

使用8倍MSAA可以極大的改善,但是不夠完美,鑒于這種技術(shù)的成本,這實在令人遺憾:

圖24:原始的網(wǎng)格 - 8倍MSAA處理

然而,采用基于紋理的解決方案,相比MSAA我們可以獲得更清晰的圖像,并且運動時的穩(wěn)定性接近完美。

圖25:優(yōu)化后的網(wǎng)格,無MSAA

2.2 幾何的一些技巧

現(xiàn)在,我們已經(jīng)整理好了車內(nèi)部分和一些小的細節(jié),我們?nèi)匀恍枰鉀Q最大的問題:車身??紤]到它定義了汽車的輪廓,因此顯然需要比其他部分的幾何圖形要更加的密集。

圖26:65000個三角形的車身網(wǎng)格

2.2.1 改善法線

有趣的是,在某種程度上,由3D藝術(shù)家設(shè)計的很多幾何圖形是不必要的:現(xiàn)代工具和渲染管道在過去幾年中已經(jīng)取得了很大的發(fā)展,但是一些舊的習慣已經(jīng)不適宜了,如果還遵循過時的最佳做法,最終效果可能適得其反。

舉個這種不良作法的例子,在幾何圖形中添加支撐邊來改善法線差值,當制作工具可以完全引入法線時,這很有意義,也有可能根本不產(chǎn)生平滑的邊緣或者邊緣非常粗糙。在差值邊緣添加支撐邊可以幫助按需要的方式確定法線的方向,從而使光照能夠更緊密的匹配密集網(wǎng)格的外觀。

但是任何現(xiàn)代且好用的制作工具都應(yīng)該支持局部加權(quán)法線,無需額外的幾何圖形就可以產(chǎn)生非常好的效果。下圖顯示了局部加權(quán)法線與密集網(wǎng)格陰影效果的匹配程度:


為了處理得更好,因為所做的只是改變法線的計算方式,因此不需要消耗性能,也不需要任何工程操作就可以集成到渲染器中。

盡管它們可以幫助消除很多網(wǎng)格中存在的一些邊緣環(huán),但是局部加權(quán)法線不會以任何方式解決輪廓的問題,所以我們?nèi)匀恍枰獢?shù)量相對較多的三角形來實現(xiàn)。

2.2.2 幾何格式

表面上雖然是這樣,但是有很多方法可以使用PowerVR SDK工具來降低幾何圖形的渲染成本,PVRGeoPod可用于3D創(chuàng)作程序包的導(dǎo)出,它是最受歡迎的場景導(dǎo)出工具,可以用來微調(diào)幾何圖形的表示方式。

圖27:POD導(dǎo)出工具的推薦幾何設(shè)置

我們需要查看的第一個選項是索引。有了索引就可以通過索引緩存訪問三角形的頂點,這個緩存可以讓同一個頂點使用多次,從而避免復(fù)制多個三角形頂點的需要。我們在PowerVR GE8300 GPU上進行了測試,顯示從標準的三角形列表轉(zhuǎn)換為索引列表使得頂點處理的性能翻倍。

接下來是容易忽略但又很容易解決的問題:三角形和頂點排序。這里的目的是最大程度利用緩存,即確保我們不會遍歷內(nèi)存獲取所有幾何圖形數(shù)據(jù),而是盡可能采用最佳連續(xù)的方式對其進行排序。雖然不像索引一樣盡如人意,但是對三角形和頂點進行排序確實提升了27%的性能。

2.2.3 剔除和細節(jié)程度

通常最好不要將不必要的工作提交給GPU來處理,盡管PowerVR基于分片的延遲渲染(TBDR)架構(gòu)非常適合降低陰影隱藏幾何體的著色成本,但是GPU仍然必須先處理所有的頂點,如果知道某個物體對象(被遮擋或在屏幕外)不會影響圖像的質(zhì)量,那么不應(yīng)該提交給GPU來處理。

小的三角形(僅占用幾個像素)往往會破壞GPU的并行性,因此會增加性能成本但是幾乎沒有視覺差異。避免這種情形的常用方法是使用不同層次幾何密度的網(wǎng)格,根據(jù)它在屏幕的尺寸渲染最相關(guān)的部分。這對于車身渲染不是很有用,因為車身在尺寸上不會出現(xiàn)千差萬別的現(xiàn)象,但是對于一些潛在的更小元素仍然是非常有用的。

2.3 清理渲染

鋸齒現(xiàn)象通常是不可接受的,MSAA(多重采樣抗鋸齒)是常用的方法,可以減輕其影響。但是通常將采樣數(shù)量設(shè)置為硬件支持的最大值,這樣會導(dǎo)致圖像質(zhì)量提升有限同時性能急劇下降。

為了正確的消除鋸齒,我們必須知道原因,僅僅認為它只是源于幾何體邊緣的失真,這種認識是非常淺顯的。我們應(yīng)該考慮以下幾種鋸齒類型:

2.3.1 紋理鋸齒

可能是最容易修復(fù)的一種:對所有的紋理進行mipmaps(多級映射)處理,這可能導(dǎo)致一些紋理過于軟化,使用各向異性過濾通常是修復(fù)這種問題的建議做法,這種方法更加的正確,但是代價也更高一些,因此需要慎重的考慮。代價更低的方法是為紋理指令引入第三個參數(shù),簡單的進行mipmap層級估計從而降低這種現(xiàn)象。

lowp vec3 colour = texture(tex, uv, -1.0).rgb;

2.3.2 幾何鋸齒

在這種情況下,MSAA是處理這種問題的正確方式,它本身就是非常的精確。雖然可以解決這種問題,但是代價比較高尤其是采樣數(shù)量高,因此對于低端設(shè)備應(yīng)避免使用2x MSAA。這聽起來很嚴格,但是如果你已經(jīng)采用了前面提到的所有小技巧,那么車身的細節(jié)部分應(yīng)該已經(jīng)非常清晰了。

FXAA(快速近似抗鋸齒)是另一種可能性,它采用后處理方式對高對比部分(即可能是由鋸齒引起的)進行了模糊處理,與MSAA不同,這種方式不會使圖像清晰,但是確實能夠讓圖像看起來更干凈。適中的圖像質(zhì)量帶來的好處并不一定會超過圖像質(zhì)量的損失,在MSAA基礎(chǔ)上使用它可以產(chǎn)生更清晰的圖像。還應(yīng)該指出的是文本應(yīng)該在FXAA(快速近似抗鋸齒)后進行渲染,否則產(chǎn)生的模糊效果會使其可讀性大大降低。

圖28: 2x MSAA 與輕量級FXAA(快速近似抗鋸齒)的幾何抗鋸齒效果對比

2.3.3 陰影鋸齒

這種類型的鋸齒稍微更復(fù)雜一些,產(chǎn)生的原因也更多??赡苁侵鞯臈l件控制導(dǎo)致相鄰像素間的不連續(xù)或更可能是高頻的表面細節(jié)導(dǎo)致像素光照和反射情況的急劇變化。

對于車身的渲染,大量的金屬表面或非常光亮的表面將會在一些小的部位或彎曲的區(qū)域產(chǎn)生大量的鋸齒,基于局部曲率可以減少反射的平滑度,如本演示中所解釋的那樣(幻燈片43)。

圖29:幾何體曲率

圖30:標準的光亮車身顯示出許多鋸齒

圖31:反射粗糙度受曲率的影響,可以使車身變得更加清楚

陰影鋸齒在改善反射效果上是有效的,計算成本是非常低的,而且也容易實現(xiàn)。

表2:使用和不使用曲率抗鋸齒的渲染時間對比(ms)

該技術(shù)非常適合中等密度的網(wǎng)格,比如車身。對于其他網(wǎng)格若采用基于紋理的工作流程,也可以保護高質(zhì)量網(wǎng)格的曲率使用低分辨率,使用它來偏置表面的反射率,從而避免高頻反射的不穩(wěn)定性。

圖32:高質(zhì)量網(wǎng)格的曲率投射到儀表板浮動幾何體上

圖33:原始粗糙度(左)和修改后的(右),越暗的地方越光亮

圖34:使用原始(左)和修改后(右)的粗糙度貼圖進行渲染,顯示出光亮金屬表面鋸齒的明顯差異

對于其他類型的鋸齒,F(xiàn)XAA(快速近似抗鋸齒)應(yīng)該能夠消除它們。作為圖像的過濾器它通過單程著色能夠清除所有類型的鋸齒

3、結(jié)合在一起

我們這個儀表板案例最重要的設(shè)計決策是將渲染的中心部分(比如3D車身)劃分為單獨的渲染目標。這出于以下原因:
1. 它支持復(fù)雜的過渡變換(縮放、平移、淡入淡出等)
2. 與儀表板UI不同,中心部分需要一系列的抗鋸齒處理,若應(yīng)用到整體會非常的浪費
3. 如果沒有任何變化,則可以渲染暫停緩存(盡管我們實際上并沒有使用過,因為我們想展示GPU的性能極限)或者在不同的頻率下運行
4. 可以按不同的分辨率渲染,從而可以在一系列GPU上進行不同的縮放處理(出于類似的原因?qū)嶋H上我們也未使用)

圖35:儀表盤的幾何圖形包含最多600個三角形,沒有這些復(fù)雜的紋理整體就不夠美觀

移動端GPU適用于對帶寬敏感的場合,因此對于大型且單獨的渲染目標,渲染成本是非常高的。第一步(也是最顯要的)是使整個渲染帶寬的成本最小化,確定好合適的帶寬:如果中心部分只占顯示的一半尺寸,那么按照一半的分辨率進行渲染效果也是非常明顯的。

但是最重要的是告訴GPU需要寫入或讀取哪些內(nèi)容,這部分很容易就會被忽視,因為關(guān)于渲染的大部分規(guī)則最是針對臺式機GPU設(shè)計的,它們不需要考慮這一點,只有最新的圖形API提供了適當?shù)臋C制。

對于典型的渲染操作每一幀都應(yīng)該做的兩件事:
1) 開始時清除之前的所有渲染
2) 在每一幀的末尾告知驅(qū)動程序舍棄深度緩沖區(qū)的內(nèi)容

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 渲染操作執(zhí)行到這里

GLenum depthAttachment = GL_DEPTH_ATTACHMENT;
glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, &depthAttachment);

這種簡單的結(jié)構(gòu)將大大減少渲染到紋理的帶寬成本,而且在運行應(yīng)用程序時能夠大大降低功耗。

4、結(jié)論

在面積優(yōu)化的嵌入式平臺上實時運行高質(zhì)量的圖形內(nèi)容是具有挑戰(zhàn)性的,我們已經(jīng)展示了一些技術(shù)用于創(chuàng)建高度詳細且高效的儀表盤,其中一些技術(shù)對于其他應(yīng)用案例也是非常有用的。每個項目都是不同的,因此并非此處列出的所有技術(shù)都相關(guān)或者適用,但它們通常為實現(xiàn)效率提供合理的基礎(chǔ)。近年來移動端圖形技術(shù)已經(jīng)走了很長一段路,盡管嵌入式GPU比臺式機版本小很多,但是它們支持的特性是可以比擬的,這意味著我們在對移動端優(yōu)化時輕松的找到靈感,這些技術(shù)在游戲行業(yè)已經(jīng)應(yīng)用了很多年,支持最新工具和渲染技術(shù)的現(xiàn)代化流程可以在更高的幀速率情況下渲染的質(zhì)量更好。

PowerVR SDK為你提供合適的工具,幫你了解在GPU內(nèi)部到底發(fā)生了什么,對于特定平臺上的特定應(yīng)用這些工具幫助你形成自己的見解,確定哪些建議是切實可行的。

最重要的一點是記住大多數(shù)優(yōu)化指導(dǎo)都會對一些應(yīng)該避免的作出嚴厲明確的聲明(比如“不要使用透明度”、“著色器代價很高,要保證它們盡可能的小”),雖然這些建議還不錯,但應(yīng)用還是要謹慎,不要盲目的認為采用復(fù)雜的技術(shù)就能夠帶來更好的結(jié)果。本文給出的例子就很好的說明了這一點。盡管使用透明度和復(fù)雜的著色器通常是不建議的,但是采用它們來渲染刻度盤證明是非常出色的決策。

來源:電子創(chuàng)新網(wǎng)

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1491次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  95次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關(guān)電源原理及各功能電路詳解
  10. 0.38 MB  |  11次下載  |  免費
  11. 6100W短波放大電路圖
  12. 0.05 MB  |  4次下載  |  3 積分
  13. 7基于單片機和 SG3525的程控開關(guān)電源設(shè)計
  14. 0.23 MB  |  4次下載  |  免費
  15. 8基于AT89C2051/4051單片機編程器的實驗
  16. 0.11 MB  |  4次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應(yīng)用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關(guān)電源設(shè)計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537793次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費