OpenGL ES 3.0基礎概念筆記

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計。該API由Khronos集團定義推廣,Khronos是一個圖形軟硬件行業協會,該協會主要關注圖形和多媒體方面的開放標準。編程

OpenGL 渲染流程

一個用來渲染圖像的OpenGL程序須要執行的主要操做以下所示:數組

  • 從OpenGL的幾何圖元中設置數據 ,用於構建圖形。
  • 使用不一樣的着色器(shader)對輸入的圖元數據執行計算操做,判斷它們的位置、顏色,以及其餘渲染屬性。
  • 將輸入圖原點額數學描述轉換爲與屏幕位置相對應的像素片元(fragment)。這一步也被稱爲光柵化(rasterization)。
  • 最後,針對光柵化過程產生的每一個片元,執行片元着色器(fragment shader),從而決定這個片元的最終顏色和位置。
  • 若是有必要,還須要對每一個片元執行一些額外的操做,例如判斷片元對應的對象是否可見,或者將片元的顏色與當前屏幕位置的顏色進行融合。

OpenGL是使用客戶端 - 服務端的形式實現的,咱們編寫的應用程序能夠看作客戶端,而計算機圖形硬件廠商所提供的OpenGL實現能夠看作服務端。緩存

OpenGL ES對Android平臺的支持狀況

OpenGL ES當前主要版本有1.0/1.1/2.0/3.0/3.1。函數

OpenGL ES版本 Android版本 描述
OpenGL ES1.0 Android 1.0+ OpenGL ES 1.x是針對固定硬件管線的,Android 1.0和更高的版本支持這個API規範。
OpenGL ES2.0 Android 2.2(API 8)+ OpenGL ES 2.x是針對可編程硬件管線的,不兼容OpenGL ES 1.x,Android 2.2(API 8)和更高的版本支持這個API規範。
OpenGL ES3.0 Android 4.3(API 18)+ 向下兼容OpenGL ES 2.x,Android 4.3(API 18)及更高的版本支持這個API規範。
OpenGL ES3.1 Android 5.0 (API 21)+ 向下兼容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支持這個API規範

OpenGL ES 3.0主要新功能有:

  • 一、渲染管線多重加強,實現先進視覺效果的加速,包括遮擋查詢(Occlusion Query)、變緩反饋(Transform Feedback)、實例渲染(Instanced Rendering)、四個或更多渲染目標支持。
  • 二、高質量ETC2/EAC紋理壓縮格式成爲一項標準功能,不一樣平臺上再也不須要須要不一樣的紋理集。
  • 三、新版GLSL ES 3.0着色語言,全面支持整數和32位浮點操做。
  • 四、紋理功能大幅加強,支持浮點紋理、3D紋理、深度紋理、頂點紋理、NPOT紋理、R/RG單雙通道紋理、不可變紋理、2D陣列紋理、無二次冪限制紋理、陰影對比、調配(swizzle)、LOD與mip level clamps、無縫立方體貼圖、採樣對象、紋理MSAA抗鋸齒渲染器。
  • 五、一系列普遍的精確尺寸紋理和渲染緩衝格式,便攜移動應用更簡單。

OpenGL ES 3.0圖形管線圖

OpenGL ES 3.0實現了具備可編程着色功能的圖形管線,由兩個規範組成:OpenGL ES 3.0 API 規範OpenGL ES着色語言3.0規範(OpenGL ES SL)post

圖中藍色方框表明OpenGL ES 3.0中管線的可編程階段。測試

頂點着色器

頂點着色器實現了頂點操做的通用可編程方法。spa

頂點着色器的輸入包括:設計

  • 着色器程序 一一描述頂點上執行操做的頂點着色器程序源代碼或者可執行文件。
  • 頂點着色器輸入(或者屬性) 一一用頂點數組提供的每一個頂點的數據。
  • 統一變量(uniform) 一一頂點(或者片斷)着色器使用的不變數據。
  • 採樣器 一一表明頂點着色器使用紋理的特殊統一變量類型。

頂點着色器的輸出在OpenGL ES 2.0中稱爲可變(varying)變量,但在OpenGL ES 3.0中更名爲頂點着色器輸出變量。code

頂點着色器能夠用於經過矩陣變換位置、計算照明公式來生成逐頂點顏色以及生成或者變換紋理座標等基於頂點的傳統操做。orm

頂點着色器取得一個位置及相關的顏色數據做爲輸入屬性,用一個 4x4矩陣變換位置,並輸出變換後的位置和顏色。

#version 300 es // OpenGL ES版本信息
uniform mat4 u_mvpMatrix;  // 同一變量u_mvpMatrix,它存儲組合的模型視圖和投影矩陣。

// 描述頂點着色器的輸入
in vec4 a_postion; // 輸入頂點位置屬性
in vec4 a_color; // 輸入頂點顏色屬性

out vec4 v_color; // 存儲描述每一個頂點顏色的頂點着色器輸出

void main(){ // 主函數
	v_color = a_color; // 讀入頂點屬性輸入a_color,並將其寫入頂點輸出顏色v_color
	gl_Position = u_mvpMatrix * a_postion // gl_Position是自動生成的,將變換後的頂點位置寫入gl_Position輸出
}
複製代碼

圖元裝配

圖元(Primitive)是三角形、直線或者點精靈等幾何對象。圖元的每一個頂點被髮送到頂點着色器的不一樣拷貝。在圖元裝配期間,這些頂點被組合爲圖元。

對於每一個圖元,必須肯定圖元是否位於視椎體(屏幕上可見的3D空間區域)內。若是沒有徹底在視錐體內,則可能須要進行裁剪。若是圖元徹底處於該區域以外,它就會被拋棄。裁剪以後,頂點位置被轉換爲屏幕座標。裁剪和淘汰後,將數據傳給下一階段 - 光柵化階段。

光柵化

在此階段繪製對應的圖元(點精靈、直線或者三角形)。光柵化是將圖元轉化爲一組二維片斷的過程,而後,這些片斷由片斷着色器處理。這些二維片斷表明着可在屏幕上繪製的像素。

片斷着色器

片斷着色器片斷着色器爲片斷上的操做實現了通用的可編程方法。

對光柵化階段生成的每一個片斷執行這個着色器,採用以下輸入:

  • 着色器程序——描述片斷上所執行操做的片斷着色器程序源代碼或者可執行文件。
  • 輸入變量——光姍化單元用插值爲每一個片斷生成的頂點着色器鈞出。
  • 統一變量——片斷(或者頂點)着色器使用的不變數據。
  • 採樣器——表明片斷着色器所用紋理的特殊統一變量類型。
#version 300 es // OpenGL ES版本信息
precision mediump float; // 設置默認的精度限定符

in vec4 v_color; // 描述片斷着色器的輸入

out vec4 fragColor; // 片斷着色器輸出變量的聲明

void main(){
    fragColor = v_color;
}
複製代碼

逐片斷操做

在這個階段中會對一個片斷進行各類測試,來決定它是否可見。若是一個片斷成功經過了全部測試,那麼它就會被直接繪製到幀緩存中了, 它對應的像素的顏色值會被更新,若是開啓了融合模式,那麼片斷的顏色會與該像素當前的顏色相疊加,造成一個新的顏色值並寫入幀緩存中。

參考: 《OpenGL編程指南第8版》 《OpenGL ES 3.0編程指南》

相關文章
相關標籤/搜索