OpneGL ES 是以手持和嵌入式為目標(biāo)的高級(jí)3D圖形應(yīng)用程序編程接口,OpenGL ES是目前智能手機(jī)中占據(jù)統(tǒng)治地位的圖形API。支持的平臺(tái)Android、iOS、Linux、Windows.
OpenGL ES 開(kāi)放式圖形庫(kù)用于可視化的二維和三維數(shù)據(jù)。OpenGL ES是OpenGL的簡(jiǎn)化版本,它消除了冗余功能,提供了一個(gè)既易于學(xué)習(xí)又更易于在移動(dòng)圖形硬件中實(shí)現(xiàn)的庫(kù)。
OpenGL ES 允許應(yīng)用程序利用底層圖形處理器的強(qiáng)大功能。iOS設(shè)備上GPU可以執(zhí)行復(fù)雜的2D和3D繪圖,以及最終圖像中每個(gè)像素的復(fù)雜著色計(jì)算。
OpenGL 圖形管線:


Application 應(yīng)用
Primitives 圖元
vertex 頂點(diǎn)
Geometry 幾何
Primitive assembly 圖元裝配
Fragment 片元
Texturing 紋理
Fog 霧化
blending 綁定
頂點(diǎn)著色器:
著色器程序:描述頂點(diǎn)上執(zhí)行操作的頂點(diǎn)著色器程序源代碼或可執(zhí)行文件
頂點(diǎn)著色器輸入:用頂點(diǎn)數(shù)組提供每個(gè)頂點(diǎn)的數(shù)據(jù)
uniform:頂點(diǎn)或片元著色器使用的不變數(shù)據(jù)
采樣器:代表頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型。

頂點(diǎn)著色業(yè)務(wù):
矩陣變換位置
計(jì)算光照公式生成逐頂點(diǎn)顏色
生成/變換紋理坐標(biāo)
它可以用于執(zhí)行自定義計(jì)算,實(shí)施新的變換,照明或者傳統(tǒng)的固定功能所不允許的基于頂點(diǎn)的效果。
頂點(diǎn)著色器代碼案例:

圖元裝配:
頂點(diǎn)著色器之后的階段就是圖元裝配
圖元:(Primitive)點(diǎn)、線、三角形
圖元裝配:將頂點(diǎn)數(shù)據(jù)計(jì)算成一個(gè)個(gè)圖元,在這個(gè)階段會(huì)執(zhí)行裁剪、透視、分割和viewport等變換操作。
圖元類型和頂點(diǎn)確定將被渲染的單獨(dú)圖元,對(duì)于每個(gè)單獨(dú)圖元及對(duì)應(yīng)的頂點(diǎn),圖元裝配階段執(zhí)行的操作包括:將頂點(diǎn)著色器的輸出值執(zhí)行裁剪、透視、分割,視口變換后進(jìn)入光柵化階段。
光柵化:
在這個(gè)階段繪制對(duì)應(yīng)的圖元,光柵化就是將圖元轉(zhuǎn)化成一組二維片段的過(guò)程。而這些轉(zhuǎn)化的片段將由片元著色器處理。這些二維片段就是屏幕上可繪制的像素。

片元著色器:
著色器程序:描述片段上執(zhí)行操作的片元著色器程序源代碼/可執(zhí)行文件
輸入變量:光柵化單元用差值為每個(gè)片段生成的頂點(diǎn)著色器輸出
uniform:頂點(diǎn)、片元著色器使用的不變數(shù)據(jù)
采樣器:代表片元著色器使用紋理的特殊統(tǒng)一變量類型
片元著色器業(yè)務(wù):
計(jì)算顏色
獲取紋理值
往像素點(diǎn)中心填充顏色/紋理值
可以用于圖片、視頻、圖形中每個(gè)像素的顏色填充、比如給視頻加濾鏡,實(shí)際上就是將視頻中每個(gè)圖片的像素點(diǎn)的顏色值進(jìn)行修改。
片元著色器代碼:

逐片段操作流程:

像素歸屬測(cè)試:
確定幀緩存區(qū)中的位置[Xw,Yw]的像素目前是不是歸屬于OpenGLES所有。例如,如果一個(gè)顯示OpenGL ES幀緩存區(qū)view被另外一個(gè)view所遮蔽。則在窗口系統(tǒng)的判定中,被遮蔽的像素不屬于OpenGL ES的上下文。從而不全顯示這些像素。
而像素歸屬測(cè)試是OpenGL ES的一部分,它不由開(kāi)發(fā)人員人為控制,而由OpenGL ES內(nèi)部進(jìn)行。
裁剪測(cè)試:裁剪測(cè)試確定[Xw,Yw]是否位于作為OpenGL ES狀態(tài)的一部分裁剪矩形范圍內(nèi),如果該片段屬于裁剪區(qū)域之外,則被拋棄。
深度測(cè)試:輸入片段的深度值進(jìn)行比較,確定片段是否拒絕測(cè)試。
混合:將新生的片段顏色與保存在幀緩存位置的顏色組合起來(lái)
抖動(dòng):抖動(dòng)可以用于最小化,因?yàn)槭褂糜邢蘧仍趲彺鎱^(qū)中保存顏色值兒產(chǎn)生偽像。
EGL:Embedded Graphics Library
OpenGL ES 命令需要渲染上下文和繪制表面才能完成圖形的繪制。
渲染上下文:存儲(chǔ)相關(guān)OpenGL ES狀態(tài)。
繪制表面:是用于繪制圖元的表面,它指定渲染所需要的緩存區(qū)類型,例如顏色緩存區(qū),深度緩存區(qū),模板緩存區(qū)。
OpenGL ES API 并沒(méi)有提供如何創(chuàng)建渲染上下文或者上下文如何連接到原生窗口系統(tǒng)。EGL是khronos渲染API[如OpenGL ES]和原生窗口系統(tǒng)之間的接口。唯一支持OpenGL ES卻不支持EGL平臺(tái)是iOS.
Apple提供自己的EGL API的iOS實(shí)現(xiàn),稱為EAGL。
因?yàn)槊總€(gè)窗口系統(tǒng)都有不同的定義,所以EGL提供基本的不透明類型-EGLDisplay,這個(gè)類型封裝了所有系統(tǒng)相關(guān)性,用于和原生窗口系統(tǒng)接口。
由于OpenGL ES是基于C的API,因此受到很廣泛的支持。作為C的API,它與Objective-C Cocoa Touch應(yīng)用程序無(wú)縫集成。
OpenGL ES規(guī)范中沒(méi)有定義窗口層。相反,托管操作系統(tǒng)必須提供函數(shù)來(lái)創(chuàng)建一個(gè)接受命令的OpenGL ES 上下文和一個(gè)幀緩存區(qū),其中寫入所有繪圖命令的結(jié)果。
在iOS中使用OpenGL ES需要使用iOS類來(lái)設(shè)置和呈現(xiàn)繪圖表面,并使用平臺(tái)中立的API來(lái)呈現(xiàn)其內(nèi)容。
計(jì)算機(jī)對(duì)動(dòng)畫的實(shí)現(xiàn)

