個人
OpenGL
專題學習目錄,但願和你們一塊兒學習交流進步!編程
- OpenGL學習(一)-- 術語瞭解
- OpenGL學習(二)-- Xcode 搭建 OpenGL 環境
- OpenGL學習(三)-- OpenGL 基礎渲染
- OpenGL學習(四)-- 正面&背面剔除和深度測試
- OpenGL學習(五)-- 裁剪與混合
- OpenGL學習(六)-- 基礎紋理
- OpenGL學習(七)-- 基礎變化綜合練習實踐總結
- OpenGL學習(八)-- OpenGL ES 初探(上)
- OpenGL學習(九)-- OpenGL ES 初探(下)GLKit
- OpenGL學習(十)-- 着色語言 GLSL 語法介紹
- OpenGL學習(十一)-- 用 GLSL 實現加載圖片
- OpenGL學習(十二)-- OpenGL ES 紋理翻轉的策略對比
在以前,我寫了幾篇學習 OpenGL 的文章,你們有興趣的能夠去看一下,在學習了 OpenGL 的基礎上,如今再來學習一下它的簡化版本—— OpenGL ES。數組
OpenGL ES(OpenGL for Embedded Systems)是以手持和嵌⼊式設備爲⽬標的⾼級 3D 圖形應⽤程序編程接口(API)。 OpenGL ES 是目前智能手機中佔據統治地位的圖形 API。支持的平臺包括:iOS,Andriod,BlackBerry,bada,Linux 和 Windows,它仍是基於瀏覽器的 3D 圖形 Web 標準WebGL 的基礎。瀏覽器
OpenGL ES 是 OpenGL 的簡化版本,它消除了冗餘功能,提供了一個既易於學習又更易於在移動圖形硬件中實現的庫。OpenGL ES容許應⽤程序利⽤底層圖形處理器的強大功能。iOS 設備上的 GPU 能夠執行復雜的 2D 和 3D 繪圖,以及最終圖像中每一個像素的複雜着色計算。緩存
簡單的來講,OpenGL ES 和 OpenGL 學習起來大體同樣,有不少重複的知識點。整個渲染管線流程如上圖,仍是之前那一套,具體流程能夠看我以前寫過的 《OpenGL基礎渲染》。因此這篇文章就再也不贅述渲染流程,而是着重介紹 OpenGL ES 中幾個重要的步驟。 可編程管線中,咱們只能操做 頂點着色器 和 片元着色器。post
頂點着色器 實現了頂點操做的通用可編程方法。學習
頂點着色器 的 輸入 包括:測試
- 着色器程序 —— 描述頂點上執⾏操做的頂點着色器程序源代碼(GLSL代碼)或者可執行⽂文件。
- 頂點着色器輸入(或者屬性
Attributes
)—— 用頂點數組提供的每一個頂點的數據。- 統一變量(
uniform
)—— 頂點(或者片斷)着色器使用的不變數據(例如旋轉矩陣)。- 採樣器 —— 表明頂點着色器使用紋理的特殊統一變量類型。
圖形表述以下圖所示:ui
此外,由於頂點着色器由應用程序規定,因此它能夠用於執行自定義計算,實施新的變換、照明或者較傳統的固定功能管線所不容許的基於頂點的效果。spa
格式:
通道修飾符
類型
變量名
codeattribute vec4 position; attribute vec2 textCoordinate; uniform mat4 rotateMatrix; 複製代碼
attribute
和uniform
對應 通道修飾符 , 分別是attribute
屬性通道 和uniform
通道。vec4
、vec2
和mat4
對應 類型,vec4
表明 4 維向量,vec2
表明 2 維向量,mat4
表明 4 行 4 列的矩陣類型。position
和textCoordinate
對應 變量名,能夠隨便起。varying lowp vec2 varyTextCoord; 複製代碼
varying
表明的也是一種通道,lowp
是一個精度,低精度、高精度等,能夠不寫。
- 這裏
position
聲明的是 頂點座標,textCoordinate
聲明的是 紋理座標。rotateMatrix
聲明的是個 旋轉矩陣。
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 變換操做。 在這以後將進⼊ 光柵化 階段。
在此階段繪製對應的圖元(點精靈、直線或者三角形)。光柵化是將圖元轉化爲一組二維片斷的過程,而後這些片斷由片元着色器處理。這些二維片斷表明着可在屏幕上繪製的像素。
片元/⽚段着色器 的 輸入 包括:
- 着色器程序 —— 描述⽚段上執⾏操做的片元着⾊器程序源代碼/可執行⽂件。
- 輸入變量—— 光柵化單元用插值爲每一個片斷生成的頂點着⾊器輸出。
- 統一變量(
uniform
)—— 頂點(或者片斷)着色器使用的不變數據。- 採樣器 —— 表明⽚元着色器使⽤紋理的特殊統一變量類型。
圖形表述以下圖所示:
總結: 它能夠用於圖片/視頻/圖形中每一個像素的顏色填充(好比給視頻添加濾鏡,實際上就是將視頻中每一個圖片的像素點顏色填充進行修改)。
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
通道傳進來的紋理採樣器,經過它能夠拿到對應的紋理。
片元着色器以後,下一階段就是 逐片斷操做。
- 像素歸屬測試: 這個測試肯定幀緩存區中位置 (Xw, Yw) 的像素目前是否是歸 OpenGL ES 全部。例如,若是⼀個顯示 OpenGL ES 幀緩存區窗口的窗口被另一個窗口所遮蔽,則窗⼝系統能夠肯定被遮蔽的像素不屬於 OpenGL ES 上下文。從⽽徹底不顯示這些像素。雖然像素歸屬測試是 OpenGL ES 的⼀部分,但它不禁開發人員控制,⽽是在 OpenGL ES 內部進行。
- 裁剪測試: 裁剪測試肯定 (Xw, Yw) 是否位於做爲 OpenGL ES 狀態的一部分的裁剪矩形範圍內。若是該⽚段位於裁剪區域以外,則被拋棄。
- 深度測試: 輸⼊片斷的深度值比較,肯定⽚段是否應該被拒絕。
- 混合: 混合將新生成的⽚段顏⾊值與保存在幀緩衝區 (Xw, Yw) 位置的顏⾊值組合起來。
- 抖動: 抖動可用於最⼩化,由於使用有限精度在幀緩存區中保存顏色⽽產生的僞像。
OpenGL ES 命令須要 渲染上下文 和 繪製表面 才能完成圖形圖像的繪製。
- 渲染上下文: 存儲相關 OpenGL ES 狀態。
- 繪製表⾯: 是⽤於繪製圖元的表面,它指定渲染所須要的緩存區類型,例如顏色緩衝區、深度緩衝區和模板緩衝區。
OpenGL ES API 並無提供如何建立渲染上下文或者上下文如何鏈接到原⽣窗⼝系統。EGL 是 Khronos 渲染 API(如OpenGL ES)和原生窗口系統之間的接口。惟一⽀持 OpenGL ES 卻不⽀持 EGL 的平臺是 iOS。Apple 提供本身的 EGL API 的 iOS 實現,稱爲 EAGL。 由於每一個窗⼝系統都有不一樣的定義,因此 EGL 提供基本的不透明類型—EGLDisplay,這個類型封裝了全部統相關性,⽤於和原⽣生窗⼝系統接口。
至此,咱們完成了 OpenGL ES 的初探(上)。後面我還會繼續分享深刻學習 OpenGL ES 的學習成果給你們,點擊進入 《OpenGL ES初探(下)—— GLKit》
以上的總結參考了並部分摘抄瞭如下文章,很是感謝如下做者的分享!: 《OPENGL ES 3.0編程指南 原書第2版》
轉載請備註原文出處,不得用於商業傳播——凡幾多