OpenGL學習(八)-- OpenGL ES 初探(上)

個人 OpenGL 專題學習目錄,但願和你們一塊兒學習交流進步!編程


1、簡介

在以前,我寫了幾篇學習 OpenGL 的文章,你們有興趣的能夠去看一下,在學習了 OpenGL 的基礎上,如今再來學習一下它的簡化版本—— OpenGL ES數組

OpenGL ES(OpenGL for Embedded Systems)是以手持和嵌⼊式設備爲⽬標的⾼級 3D 圖形應⽤程序編程接口(API)。 OpenGL ES 是目前智能手機中佔據統治地位的圖形 API。支持的平臺包括:iOS,Andriod,BlackBerry,bada,LinuxWindows,它仍是基於瀏覽器的 3D 圖形 Web 標準WebGL 的基礎。瀏覽器

OpenGL ESOpenGL 的簡化版本,它消除了冗餘功能,提供了一個既易於學習又更易於在移動圖形硬件中實現的庫。OpenGL ES容許應⽤程序利⽤底層圖形處理器的強大功能。iOS 設備上的 GPU 能夠執行復雜的 2D3D 繪圖,以及最終圖像中每一個像素的複雜着色計算。緩存

OpenGl渲染流程.png

簡單的來講,OpenGL ESOpenGL 學習起來大體同樣,有不少重複的知識點。整個渲染管線流程如上圖,仍是之前那一套,具體流程能夠看我以前寫過的 《OpenGL基礎渲染》。因此這篇文章就再也不贅述渲染流程,而是着重介紹 OpenGL ES 中幾個重要的步驟。 可編程管線中,咱們只能操做 頂點着色器片元着色器post

2、關鍵步驟介紹

一、頂點着色器

1)頂點着色器的輸入輸出:

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

頂點着色器輸入 包括:測試

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

圖形表述以下圖所示:ui

OpenGL ES頂點着色器.png

2)頂點着色器的業務:

  • 一、經過矩陣變換位置
  • 二、計算光照公式生成逐頂點顏色
  • 三、生成或變換紋理座標

此外,由於頂點着色器由應用程序規定,因此它能夠用於執行自定義計算,實施新的變換、照明或者較傳統的固定功能管線所不容許的基於頂點的效果。spa

3)GLSL 代碼的簡單認識:

格式:通道修飾符 類型 變量名code

attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
複製代碼
  • attributeuniform 對應 通道修飾符 , 分別是 attribute 屬性通道uniform 通道。
  • vec4vec2mat4 對應 類型vec4 表明 4 維向量, vec2 表明 2 維向量, mat4 表明 44 列的矩陣類型。
  • positiontextCoordinate 對應 變量名,能夠隨便起。
varying lowp vec2 varyTextCoord;
複製代碼

varying 表明的也是一種通道, lowp 是一個精度,低精度、高精度等,能夠不寫。

  • 這裏 position 聲明的是 頂點座標textCoordinate 聲明的是 紋理座標rotateMatrix 聲明的是個 旋轉矩陣

4)頂點着色器的代碼案例:

attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
varying lowp vec2 varyTextCoord;
void main()
{
// 把textCoordinate交給varyTextCoord,就能夠把紋理座標傳遞到片元着色器裏面去。
	varyTextCoord = textCoordinate;

	vec4 vPos = position;
	vPos = vPos * rotateMatrix;// 讓每個頂點都和旋轉矩陣相乘
	
	gl_Position = vPos;// gl_Position是一個內建變量,是vec4類型的,必須給它賦值。
}
複製代碼

GPU 來執行上述代碼,有幾個頂點就會執行其次,GPU 是並行的,因此會並行把全部頂點都執行了。

二、圖元裝配

頂點着色器以後,OpenGL ES 3.0 圖形管線的下一階段是 圖元裝配

圖元(Primitive): 是三角形、直線或者點精靈等幾何對象。

圖元裝配: 將頂點數據計算組合成一個個圖元,在這個階段會執行裁剪、透視分割和 Viewport 變換操做。 在這以後將進⼊ 光柵化 階段。

三、光柵化

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

光柵化階段.png

四、片元(片斷)着色器

1)片元着色器的輸入輸出:

片元/⽚段着色器輸入 包括:

  • 着色器程序 —— 描述⽚段上執⾏操做的片元着⾊器程序源代碼/可執行⽂件。
  • 輸入變量—— 光柵化單元用插值爲每一個片斷生成的頂點着⾊器輸出。
  • 統一變量(uniform—— 頂點(或者片斷)着色器使用的不變數據。
  • 採樣器 —— 表明⽚元着色器使⽤紋理的特殊統一變量類型。

圖形表述以下圖所示:

ES 片元着色器.png

2)片元着色器的業務:

  • 一、計算顏色
  • 二、獲取紋理值
  • 三、往像素點中填充顏色值【紋理值/顏色值】

總結: 它能夠用於圖片/視頻/圖形中每一個像素的顏色填充(好比給視頻添加濾鏡,實際上就是將視頻中每一個圖片的像素點顏色填充進行修改)。

3)片元着色器的代碼案例:

varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
	// texture2D(紋理採樣器, 紋理座標); 爲了取得紋素(紋理對應座標上的顏色值),好比取到了一個rgba四維變量
	gl_FragColor = texture2D(colorMap, varyTextCoord);
}
複製代碼

頂點着色器 裏的 varying lowp vec2 varyTextCoord;片元着色器 裏的 varying lowp vec2 varyTextCoord; 必須定義的如出一轍才行,包括通道、精度、類型和變量名都要一致,這樣才能從頂點着色器傳進來。 uniform sampler2D colorMap 是由 uniform 通道傳進來的紋理採樣器,經過它能夠拿到對應的紋理。

五、逐片斷操做

片元着色器以後,下一階段就是 逐片斷操做

逐片斷操做.png

  • 像素歸屬測試: 這個測試肯定幀緩存區中位置 (Xw, Yw) 的像素目前是否是歸 OpenGL ES 全部。例如,若是⼀個顯示 OpenGL ES 幀緩存區窗口的窗口被另一個窗口所遮蔽,則窗⼝系統能夠肯定被遮蔽的像素不屬於 OpenGL ES 上下文。從⽽徹底不顯示這些像素。雖然像素歸屬測試是 OpenGL ES 的⼀部分,但它不禁開發人員控制,⽽是在 OpenGL ES 內部進行。
  • 裁剪測試: 裁剪測試肯定 (Xw, Yw) 是否位於做爲 OpenGL ES 狀態的一部分的裁剪矩形範圍內。若是該⽚段位於裁剪區域以外,則被拋棄。
  • 深度測試: 輸⼊片斷的深度值比較,肯定⽚段是否應該被拒絕。
  • 混合: 混合將新生成的⽚段顏⾊值與保存在幀緩衝區 (Xw, Yw) 位置的顏⾊值組合起來。
  • 抖動: 抖動可用於最⼩化,由於使用有限精度在幀緩存區中保存顏色⽽產生的僞像。

六、EGL (Embedded Graphics Library )

OpenGL ES 命令須要 渲染上下文繪製表面 才能完成圖形圖像的繪製。

  • 渲染上下文: 存儲相關 OpenGL ES 狀態。
  • 繪製表⾯: 是⽤於繪製圖元的表面,它指定渲染所須要的緩存區類型,例如顏色緩衝區、深度緩衝區和模板緩衝區。

OpenGL ES API 並無提供如何建立渲染上下文或者上下文如何鏈接到原⽣窗⼝系統。EGLKhronos 渲染 API(如OpenGL ES)和原生窗口系統之間的接口。惟一⽀持 OpenGL ES 卻不⽀持 EGL 的平臺是 iOSApple 提供本身的 EGL APIiOS 實現,稱爲 EAGL。 由於每一個窗⼝系統都有不一樣的定義,因此 EGL 提供基本的不透明類型—EGLDisplay,這個類型封裝了全部統相關性,⽤於和原⽣生窗⼝系統接口。

至此,咱們完成了 OpenGL ES 的初探(上)。後面我還會繼續分享深刻學習 OpenGL ES 的學習成果給你們,點擊進入 《OpenGL ES初探(下)—— GLKit》

以上的總結參考了並部分摘抄瞭如下文章,很是感謝如下做者的分享!: 《OPENGL ES 3.0編程指南 原書第2版》

轉載請備註原文出處,不得用於商業傳播——凡幾多

相關文章
相關標籤/搜索