1. 程式人生 > >Qualcomm 3D圖形引擎庫演變(二)

Qualcomm 3D圖形引擎庫演變(二)

本文主要針對Adreno GPU的OpenGL ES 3.0和3.1部分新功能做一個簡單的介紹。

1 基於Adreno的OpenGL ES 3.0新功能

   本節主要描述Adreno GPU上OpenGL ES 3.0的一些功能變化。OpenGL ES 3.0於2012年8月推出,大大擴充套件了OpenGL ES功能集,適用於嵌入式應用開發人員。那個時候,OpenGL 3.x的很多複雜功能僅限於桌面開發人員使用。
舉幾個例子:

  • 取樣器物件和頂點屬性陣列除數成為桌面OpenGL的核心功能3.3
  • 無縫立方體貼圖過濾和圍欄同步物件成為桌面OpenGL 3.2的核心
  • 桌面OpenGL 3.1中引入了例項繪製呼叫和統一緩衝物件
  • 在桌面OpenGL 3.0中引入幀緩衝物件(具有多個渲染目標支援)和變換反饋

   以上所有內容都包含在核心OpenGL ES 3.0中。部分功能通過擴充套件機制在OpenGL ES 2.0中提供。如果一個開發人員希望使用不屬於ES 2.0核心規範的功能,我們需要實現一個後備程式碼路徑來滿足不支援擴充套件的裝置。這大大增加了實施的複雜性和所需的測試量。有關所有功能的更多資訊,請參閱OpenGL ES 3.0規範 https://www.khronos.org/registry/gles/specs/3.0/es_spec_3.0.3.pdf。

1.1 二維陣列紋理

   二維陣列紋理(2D陣列紋理)在二維紋理(2D紋理)的基礎上建立。在2D紋理中,mipmap級別由單個影象組成。 在2D陣列紋理中,單個mipmap級別包含許多影象。 儲存在單個mipmap中的每個影象稱為圖層。 所有給定mipmap級別的圖層具有相同的解析度。圖層資料採用當時為2D陣列紋理物件請求的內部格式建立。 給定mipmap級別的所有圖層的寬度和高度也在建立時定義並且在紋理物件的生命週期內不能更改。 每個mipmap級別的二維陣列紋理物件稱為紋理物件深度, 這也需要在建立時定義。
在這裡插入圖片描述

   可以為2D陣列紋理分配mipmap鏈。至少可以定義每個圖層只有一個基本的mipmap級別,如果不需要基於mipmap的紋理過濾,或者可用記憶體不足,紋理取樣仍然有效。mipmap級別n + 1處的所有層必須是mipmap級別n處的層的大小的一半,例如,在mipmap級別0使用4x8的圖層大小,mipmap級別1的每個圖層都需要有一個大小為2x4。 Mipmap level 2將是1x2,對於最後一個mipmap級別,每個層將採用單個畫素,每個尺寸都夾在1。

   將mipmap儲存定義為可變或不可變後,2D陣列紋理可以是:

  • 用作渲染目標,可以使用幀緩衝物件渲染圖層
  • 使用新的GLSL紋理取樣函式從任何著色器階段取樣

   ES著色語言3.0中幾乎所有可用於2D紋理的紋理取樣函式都可以用於取樣2D陣列紋理。唯一不支援此功能的是投影紋理查詢及其衍生物。如果請求的位置超出了任何軸定義的範圍,取樣功能的行為都由S / T / R wrap模式控制。

1.2 三維紋理

   從概念的角度來看,三維紋理(3D紋理)與2D非常相似陣列紋理。 兩者之間的主要區別在於資料取樣過程是如何進行的以及如何構建mipmap鏈。3D紋理由一組稱為切片的二維影象組成。 所有切片組合在一起形成一個mipmap級別。 後續的mipmap級別必須是之前的一半mipmap級別。 3D紋理物件的mipmap鏈由一組長方體組成,每個長方體都有一個內部的長方體。通常來說,後續長方體的大小是其前一個大小的一半。

   這與2D陣列紋理不同,其中每個圖層必須具有單獨的mipmap鏈分配。對於每個切片,必須定義基本的mipmap級別。 除此之外,如果使用最近或線性縮小過濾,則mipmap是可選的。 使用基於mipmap的3D紋理物件的縮小過濾,其中尚未定義mipmap鏈,將使得渲染紋理不完整,導致任何取樣操作返回vec4(0,0,0,1)。

   紋理物件用於儲存紋理資料,以便隨時使用它們。我們可以控制多個紋理,並可以返回到以前載入到紋理資源的紋理。使用紋理物件通常是應用紋理的最快方法。

   一個三維紋理物件在S,T,R紋理座標軸方向上分別擁有w(width),h(height),d(depth)個體素,相應的紋理資料在記憶體中以線性方式儲存,也就是說先儲存一個slice的第一行的畫素值,然後依次是同一個slice的其他行的畫素值,然後是同一個volume的其他slice的畫素值。

1.3 不可變紋理

   OpenGL ES 2.0核心規範認可的唯一型別的紋理物件是可變紋理物件。這意味著要完全重新定義紋理mipmap配置,在OpenGL ES應用程式執行期間的任何時候都允許被使用。不僅如此即時新增或刪除mipmap,但也允許更改內部格式或屬性。

   OpenGL ES的解決方案是不可變的紋理物件。最初介紹的GL_EXT_texture_storage擴充套件功能,它們成為OpenGL ES 3.0的核心功能。不可變紋理就像可變紋理一樣工作,除了它不再可能應用任何紋理。

   以下API函式來構造已變為不可變的物件:

  • glCompressedTexImage*
  • glCopyTexImage*
  • glTexImage*
  • glTexStorage* - 可用於初始化不可變紋理物件

   新的glTexStorage *入口點使紋理不可變。對於使用者指定的紋理目標初始化一個mipmap鏈,但不要使用任何內容填充mipmap。應用程式的職責是使用實際內容填充不可變紋理物件。
不可變紋理沒有特定的用例。相反,它們應該被視為減少驅動程式的負載一種手段,這通常可以轉換為更好的渲染效能。

   OpenGL ES 在對紋理物件載入之前,首先要使用glGenTextures建立紋理物件,紋理物件是一個容器物件,儲存渲染所需的紋理資料,例如影象資料、過濾模式和包裝模式。紋理物件不再使用時,使用glDeleteTextures進行刪除。在使用紋理物件之前,還要通過glBindTexture進行繫結,繫結之後,就可以對紋理物件進行操作。用於載入2D和立方圖紋理的基本函式是glTexImage2D,引數data包含影象的實際畫素資料,資料必須包含一定的畫素個數,每個畫素根據格式和型別規範有相應的位元組數,畫素行必須對齊到用glPixelStorei設定的GL_UNPACK_ALIGNMENT。為了得到最佳的效能,建議使用不可變紋理。

1.4 PCF

   陰影貼圖用於在電影和電視的高階渲染中建立陰影。然而,在諸如視訊的實時應用中使用陰影對映存在問題,例如遊戲中的鋸齒狀鋸齒形的混疊問題。陰影對映包括在幾何體上投影陰影貼圖,並將陰影貼圖值與光照檢視進行每個畫素的深度比較。如果投影放大了陰影貼圖,則以大的形式混疊,難看的鋸齒將出現在陰影邊界。通常可以通過使用更高的值來減少解析度陰影貼圖和增加陰影貼圖解析度的技術,例如,透視陰影貼圖。

   當光線幾乎平行於陰影表面時,使用透視陰影對映技術並增加陰影貼圖解析度不會起作用,是因為放大率接近無窮大。通過使用稱為百分比近似過濾的技術,高階渲染軟體解決了混疊問題。

   與普通紋理不同,陰影貼圖紋理無法預先過濾以去除鋸齒。反而,每個畫素進行多個陰影貼圖比較平均。這種技術稱為百分比近似過濾(PCF)。

1.5 新的內部紋理格式

   OpenGL ES 3.0引入了可用於定義紋理資料內容的大小內部格式。現在可以使用浮點,有符號和無符號整數內部表示紋理內容格式。 兩種新的內部格式可以用於儲存在sRGB顏色空間中表示顏色資訊。

   為了向後相容,繼續支援未分級的內部格式。 但是,使用它們可能會導致不同的OpenGL ES擴充套件和其他擴充套件之間的不良互動,因此建議使用新尺寸的內部格式。

1.6 變換反饋

   在GPU上執行計算並複用結果變得越來越流行,不幸的是,在OpenGL ES 2.0的核心版本中,只有一種可行的使用方法用於通用計算的GPU。所有計算都必須在片段著色器中完成,將結果儲存在當前繫結的繪製幀緩衝區的顏色附件中。這種方法有很多限制,包括:

  • Core ES 2.0僅支援使用GL_RGBA4渲染渲染緩衝區和紋理,GL_RGBA5_A1和GL_RGB565內部格式,在這方面支援非常有限的精度。
  • 核心ES 2.0不支援可顏色渲染的浮點內部格式。
  • 核心ES 2.0僅支援每幀緩衝區一個顏色附件。

   OpenGL ES 3.0引入了對變換反饋的支援,允許離開頂點著色器階段補貨並輸出變數的值。捕獲後,可以將值傳輸到一個或多個緩衝區物件區域,這個有兩種不同的方式:

  • 單個緩衝區物件區域可用於按指定的順序來儲存變化的值。
  • 可以使用多個緩衝區物件區域。在這種情況下,每個變化被分配給不同的緩衝區物件區域。多個緩衝區物件區域可以是同一緩衝區物件的一部分,但事實並非如此。

   使用單個緩衝區物件區域,從單個頂點著色器可以捕獲的最大元件數保證至少為64。使用多個緩衝區物件區域,可以從單個頂點著色器捕獲的最大元件數保證至少16。

   鑑於ES 3.0支援的新頂點資料型別的範圍,轉換反饋提供與計算著色器相當的可能性,這是OpenGL ES中沒有的功能,直到OpenGL ES 3.1的出現。

   除了上述新增的功能之外,其他功能不再一一的詳細描述,列舉如下,大的功能變動如:

  • New vertex data types
  • Vertex array objects
  • Uniform buffer objects
  • Buffer subrange mapping
  • Multiple render target support
    還有一些小的功能變化如:
  • 16-bit floating-point vertex attributes
  • 24-bit depth renderbuffers and textures
  • 24/8 depth/stencil renderbuffers and textures
  • 32-bit depth and 32f/8 depth/stencil renderbuffers and textures
  • 8-bit unsigned normalized renderbuffers
  • 8-bit-per-component signed normalized textures
  • Ability to attach any mipmap level to a frame buffer object
  • Additional pixel store state
  • Buffer object to buffer object copy operations
  • Depth textures and shadow comparison

2 基於Adreno 的OpenGL ES 3.1的新功能

   本節簡要介紹了OpenGL ES 3.1一些比較重要的特性。 有關詳細資訊,請參閱以下內容:

2.1 Atomic Counter

   Atomic Counter是OpenGL 4.2版本通過GL_ARB_shader_atomic_counters擴充套件引入的新特性,它可以在各種著色語言中使用。Atomic Counter具體來說指的是在緩衝區物件(Buffer Object)中儲存著一個或者多個可以用來計數的變數值,對這些變數定義了特定的操作方式,可以讓它們在著色語言中進行加一和減一的操作,除此之後其他所有的操作都是非法的。

   關於Atomic Counter的使用場景,一個簡單的案例是統計場景中哪些畫素會先進行渲染。具體的實現思路:當我們呼叫片元Shader對畫素進行著色的時候,我們可以讓atomic Counter變數值加1,然後將這個值轉換成一種顏色來渲染我們的畫素,這樣我們就可以很清楚看到那些畫素點是先渲染的,哪些畫素點是後渲染的了。

2.2 Compute shaders

   Compute Shader是在OpenGL4.3(Opengl ES 3.1)以後引入的一種專門用於平行計算的著色器。在計算著色器中,任務以組為單位進行執行,我們稱之為工作組(work group)。擁有鄰居的工作組被稱為本地工作組(local workgroup), 這些組可以組成更大的組,稱為全域性工作組(global workgroup),而其通常作為執行命令的一個單位。

   計算著色器會被每個本地工作組中的每個單元呼叫一次。工作組的每一個單元稱為工作項(work item),每次呼叫稱為一次執行。執行的單元之間可以通過變數和視訊記憶體進行通訊,且可以通過執行同步操作保持一致性。圖12-1顯示了一個全域性工作組。這個全域性工作組包括16個本地工作組,每個本地工作組又包括16個執行單元,排成4X4的網格,每個執行單元擁有一個二維向量表示的索引值。儘管圖示中,全域性和本地工作組都是2維的,而事實上它們都是3維的,為了適應1維、2維的任務,只需把額外的2維或1維設為0即可。計算著色器的每個執行單元本質是相互獨立的,可以並行地在支援OpenGL地GPU上執行。
在這裡插入圖片描述

2.3 ES shading language enhancements

   下面列舉的增強功能點是在OpenGL ES 3.1 的Shading Language中提出的:

  • 將浮點數拆分為有效數和指數(frexp)的函式
  • 從有效數和指數(ldexp)構建浮點數的函式
  • 執行32位有符號和無符號乘法的函式,具有32位輸入和跨越兩個32位輸出的64位結果(imulExtended,umulExtended)
  • 執行位域提取,插入和反轉的功能(bitfieldExtract,bitfieldInsert,bitfieldReverse)
  • 現在可以在ES SL程式碼中定義多維陣列

2.4 多重紋理

   多重紋理是指在同一個模型表面指定兩個或兩個以上的紋理,這些紋理通過一定的融合方式進行混合形成的效果。其每一層各自執行自己的紋理操作,並把結果傳遞給下一層,直到全部完全。主要應用在如:光照效果,貼花,合成,細節紋理等

除了上述列舉的新特性之外,還有其他的像著色器儲存緩衝區物件、單獨的著色器物件等新特性。