1. 程式人生 > >ARM Mali系列GPU加強應用ASTC技術—高動態範圍成像和3D

ARM Mali系列GPU加強應用ASTC技術—高動態範圍成像和3D

KhronosARMASTC技術(自適應可伸縮紋理壓縮技術)列為業內標準紋理壓縮的新方案。ASTC技術支援高動態範圍成像和三維紋理壓縮,我將花些時間演示如何處理紋理,以及在影象內容中它們可以採用怎樣的冷色效果。

高動態範圍成像(High Dynamic Range)

正常顏色(低動態範圍成像或LDR)的圖片在螢幕上顯示的顏色亮度為介於0(最低亮度)到1(最高亮度)的相對較低的動態範圍。超出該範圍則不能顯示,原因在於,你既不能將顏色調得比黑色更暗,也不能讓顯示器的亮度超出其最大亮度值。

儘管如此,在計算確定螢幕上的最終色彩畫素時,你通常想讓亮度超出這一範圍值。例如,物體表面的一道亮光,在調至表面的較暗色彩前,其亮度可能是最大亮度值的兩倍。如果只能在0到1之間進行調節,那麼不管你在上面打多強的光,畫面也無法調得比底色更亮。對於簡單的照明,這處理起來相當方便,你可以通過計算將原有的任何亮度調至你想要的亮度,而較高階的照明技術則通常利用紋理來支援光密度和色彩。不過如果我們只有低動態範圍紋理,進行此項操作則較麻煩。或許可以調節鮮豔色彩相關的紋理數值,不過,由於亮度梯度的線性區間影響,會在較暗區域形成條帶效應,視覺效果較差。同樣,對於顯示有光有影場景或有光源場景的紋理,如果採用LDR,則可能出現以下方面的問題,即:明亮區域偏亮、暗區不夠清晰,或者保持陰影的精度和調暗明亮區域。

我們所需要的顯示方案,應該既允許更大的動態範圍,又能在較暗區域採用較小梯度顯示色彩。來看看高動態範圍成像(HDR)紋理吧。


利用ASTC技術以3.56bpp壓縮而成的HDR影象,採用三種曝光方式顯示

OpenGL® ES中,可以採用16位元浮點數值來指定HDR紋理。但是,典型的RGB紋理相當於48位元每畫素(48bpp),而多數設計人員均不滿意每畫素24位元典型紋理所佔用的空間,如果採用48bpp,則所佔空間為兩倍,這是一個較大缺陷。因此,我們需要進行壓縮。

支援HDR

你可能會想到,ASTC技術可以採用不同編碼模式處理影象中的各種紋理單元塊,要確保選擇最有效的模式,則取決於單元塊的影象內容。在前一篇日誌中,我們談到

LDR編碼方案,不過ASTC技術也包括若干HDR編碼模式,可以修改色彩儲存和插補的方式。如果一個單元塊所含的一系列畫素值包括明暗紋理的適當分佈,或紋理數值範圍超出0~1,則色彩會以12位元偽對數的顯示方案儲存,它便於在解碼器中轉換成真正的浮點形式。這種顯示方案的優點在於,我們在LDR中採用的相同線性插值,可以運用到對數值中,從而使此類數值將我們用於顯示明暗的數值分隔開來,其產生的視覺畸變也最小。需進行的額外步驟是,在進行編碼時,需將傳入的浮點紋理值變成偽對數值;在解碼時,最終將結果轉換為浮點值。由於編碼已選定,所以這些功能操作起來相當簡單。一旦進行轉換,ASTC技術會以同樣方式將這些數值作為LDR
數值處理,從而節省了矽芯片面積,並允許在LDR模式下進行靈活選擇。

紋理建立者可以決定採用HDRLDR來達到同樣的色彩格式和位元率。當然,在許多情況下,HDR圖片比LDR圖片包含更多的資訊,因此需採用更高的位元率。我們用HDR圖片所做的實驗顯示,與8位元每畫素相比,ASTC技術可以做出的效果接近於BC6H(現有的de facto HDR壓縮標準)。儘管如此,能夠得益於低位元率的HDR影象內容種類有很多(光照圖是其中一種),而讓這種操作變得可行很有意義。

3D紋理

OpenGL, OpenGL ESDirectX APIs均支援3D紋理,但它們的利用率並不高。原因不難解釋——它們較佔空間。256x256RGB紋理較小,未壓縮情況下佔據192KiB空間。要在3D中獲得同樣的畫素解決方案,要求紋素為256x256x256,其所佔空間較大,為48MiB。對於多數應用程式而言,這便是3D技術人員所謂的“太大”。顯然,我們不是要求壓縮技術支援3D紋理,而是要讓3D紋理能夠被壓縮。

現如今,壓縮方案通過簡單地壓縮2D切片已可以全面支援3D。在256x256x256這一案例中,我們簡單地將它作為256個獨立的切片,每條切片均為256x256畫素點,然後單獨壓縮每條切片,並將它們連成矩陣。這樣做在效能和質量兩方面存在弊端。

效能問題取決於你如何看待3D紋理。如果你正在展示一個面,它與你編碼的切片方向平行,而一個紋素解碼操作只需進入單個切片內的資料單元塊。你還極有可能在同一單元塊內或在快取中發現附近的畫素點。

但是,如果你的畫面是垂直方向對映,你將需要訪問更多的紋理單元塊,影響頻寬和抖動紋理快取。這樣會形成較大程度的效能從屬,而這不是關於複雜性或內容構造等方面的可控內容,而是不可預見的視角。這真令人討厭!

第二個問題是,在3D紋理中,我們通常顯示的是實際容積資料,而真實的紋理特點是三維的。因此紋理中的這些數值與切片關聯,這便是壓縮演算法可以開發的內容。如果你將這些切片分開,會妨礙壓縮並導致在給定的位元率下形成質量較低的圖片。

ASTC技術的3D模式引入了一種新理念——壓縮資料中一個128位元的單元塊可以覆蓋一個3D足跡(從3x3x3畫素點到6x6x6畫素點,梯度在二者之間)。這相當於將位元率從4.7調低至 0.56位元每畫素。由於單元塊是立方體(或接近立方體,類似於4X4X5的規格也可操作),無論從哪個方向看,它們都是相似的。通過切片方法檢視,幾乎完全消除了效能方面的較大差異。

我們演示了利用ASTC技術在2位元每畫素的情況下進行3D紋理編碼。這相當於8X8畫素點單元塊的切片,或採用4X4X4畫素單元塊進行3D本地編碼。3D編碼可將本地質量提高約為2dB,說明圖層之間更多的關聯性可以通過壓縮演算法進行利用,從而使質量大幅提高。

對於包含邊界清楚的不同色彩區域的3D紋理而言,我們還會發現這種定義紋理劃分的方法的一大優點。如果將這種方法用作函式而非表格,則可輕鬆(一旦你意識到這種可能性)定義關於XYZ的函式,而非僅僅是XY的函式。無需大型ROM,只需最低的附加硬體成本,我們便可得到一份3D分割槽表。

3D單元塊需要對畫素加權矩陣的佈局進行修改,不過這正適合128位元單元塊的構造,並可重新利用2D情形下的大量功能單元。例如,有一種巧妙的方法是採用簡單內插的方式在加權值中插入數值,而非通過三維插值來計算有效的加權值。這樣操作可以減小與2D雙線性內插相同的工作量,而且我們可以重新利用相同的內插硬體,節省電力和空間。

讓我們切換到常規問題吧:是的,這是另一種自主選擇,因此ASTC技術還支援3D HDR紋理!不過,你還期待什麼?

互動

獲得ASTC技術評估編解碼器,請訪問Mali Developer Center,可支援LDR,HDR和3D紋理壓縮。

你是否有HDR3D紋理方面的新應用?在評論中與我們分享吧!

Sean EllisARM媒體處理部技術團隊的一員

他於1988年開始從事3D圖形工作,包括ARM最初的機器產品Archimedes。他是Java移動3D圖形標準規範(M3GM3G2)的主要制定者。目前工作是界定ARM下一代GPU的架構。他還參與專利工作,保護ARM在多媒體領域的創新成果。

原文連結:http://blogs.arm.com/multimedia/1011-more-astc-in-arm-mali-gpus-high-dynamic-range-and-3d