OpneGL ES 是以手持和嵌入式為目標的高級3D圖形應(yīng)用程序編程接口衙伶,OpenGL ES是目前智能手機中占據(jù)統(tǒng)治地位的圖形API况木。支持的平臺Android它褪、iOS擂送、Linux、Windows.
OpenGL ES 開放式圖形庫用于可視化的二維和三維數(shù)據(jù)春贸。OpenGL ES是OpenGL的簡化版本混萝,它消除了冗余功能遗遵,提供了一個既易于學習又更易于在移動圖形硬件中實現(xiàn)的庫。
OpenGL ES 允許應(yīng)用程序利用底層圖形處理器的強大功能逸嘀。iOS設(shè)備上GPU可以執(zhí)行復雜的2D和3D繪圖车要,以及最終圖像中每個像素的復雜著色計算。
OpenGL 圖形管線:
Application 應(yīng)用
Primitives 圖元
vertex 頂點
Geometry 幾何
Primitive assembly 圖元裝配
Fragment 片元
Texturing 紋理
Fog 霧化
blending 綁定
頂點著色器:
著色器程序:描述頂點上執(zhí)行操作的頂點著色器程序源代碼或可執(zhí)行文件
頂點著色器輸入:用頂點數(shù)組提供每個頂點的數(shù)據(jù)
uniform:頂點或片元著色器使用的不變數(shù)據(jù)
采樣器:代表頂點著色器使用紋理的特殊統(tǒng)一變量類型崭倘。
頂點著色業(yè)務(wù):
矩陣變換位置
計算光照公式生成逐頂點顏色
生成/變換紋理坐標
它可以用于執(zhí)行自定義計算翼岁,實施新的變換,照明或者傳統(tǒng)的固定功能所不允許的基于頂點的效果绳姨。
頂點著色器代碼案例:
圖元裝配:
頂點著色器之后的階段就是圖元裝配
圖元:(Primitive)點登澜、線、三角形
圖元裝配:將頂點數(shù)據(jù)計算成一個個圖元飘庄,在這個階段會執(zhí)行裁剪脑蠕、透視、分割和viewport等變換操作跪削。
圖元類型和頂點確定將被渲染的單獨圖元谴仙,對于每個單獨圖元及對應(yīng)的頂點,圖元裝配階段執(zhí)行的操作包括:將頂點著色器的輸出值執(zhí)行裁剪碾盐、透視晃跺、分割,視口變換后進入光柵化階段毫玖。
光柵化:
在這個階段繪制對應(yīng)的圖元掀虎,光柵化就是將圖元轉(zhuǎn)化成一組二維片段的過程。而這些轉(zhuǎn)化的片段將由片元著色器處理付枫。這些二維片段就是屏幕上可繪制的像素烹玉。
片元著色器:
著色器程序:描述片段上執(zhí)行操作的片元著色器程序源代碼/可執(zhí)行文件
輸入變量:光柵化單元用差值為每個片段生成的頂點著色器輸出
uniform:頂點、片元著色器使用的不變數(shù)據(jù)
采樣器:代表片元著色器使用紋理的特殊統(tǒng)一變量類型
片元著色器業(yè)務(wù):
計算顏色
獲取紋理值
往像素點中心填充顏色/紋理值
可以用于圖片阐滩、視頻二打、圖形中每個像素的顏色填充、比如給視頻加濾鏡掂榔,實際上就是將視頻中每個圖片的像素點的顏色值進行修改继效。
片元著色器代碼:
逐片段操作流程:
像素歸屬測試:
確定幀緩存區(qū)中的位置[Xw,Yw]的像素目前是不是歸屬于OpenGLES所有。例如装获,如果一個顯示OpenGL ES幀緩存區(qū)view被另外一個view所遮蔽瑞信。則在窗口系統(tǒng)的判定中,被遮蔽的像素不屬于OpenGL ES的上下文饱溢。從而不全顯示這些像素喧伞。
而像素歸屬測試是OpenGL ES的一部分,它不由開發(fā)人員人為控制绩郎,而由OpenGL ES內(nèi)部進行潘鲫。
裁剪測試:裁剪測試確定[Xw,Yw]是否位于作為OpenGL ES狀態(tài)的一部分裁剪矩形范圍內(nèi),如果該片段屬于裁剪區(qū)域之外肋杖,則被拋棄溉仑。
深度測試:輸入片段的深度值進行比較,確定片段是否拒絕測試状植。
混合:將新生的片段顏色與保存在幀緩存位置的顏色組合起來
抖動:抖動可以用于最小化浊竟,因為使用有限精度在幀緩存區(qū)中保存顏色值兒產(chǎn)生偽像。
EGL:Embedded Graphics Library
OpenGL ES 命令需要渲染上下文和繪制表面才能完成圖形的繪制津畸。
渲染上下文:存儲相關(guān)OpenGL ES狀態(tài)振定。
繪制表面:是用于繪制圖元的表面,它指定渲染所需要的緩存區(qū)類型肉拓,例如顏色緩存區(qū)后频,深度緩存區(qū),模板緩存區(qū)暖途。
OpenGL ES API 并沒有提供如何創(chuàng)建渲染上下文或者上下文如何連接到原生窗口系統(tǒng)卑惜。EGL是khronos渲染API[如OpenGL ES]和原生窗口系統(tǒng)之間的接口。唯一支持OpenGL ES卻不支持EGL平臺是iOS.
Apple提供自己的EGL API的iOS實現(xiàn)驻售,稱為EAGL露久。
因為每個窗口系統(tǒng)都有不同的定義,所以EGL提供基本的不透明類型-EGLDisplay,這個類型封裝了所有系統(tǒng)相關(guān)性欺栗,用于和原生窗口系統(tǒng)接口毫痕。
由于OpenGL ES是基于C的API,因此受到很廣泛的支持迟几。作為C的API,它與Objective-C Cocoa Touch應(yīng)用程序無縫集成消请。
OpenGL ES規(guī)范中沒有定義窗口層。相反瘤旨,托管操作系統(tǒng)必須提供函數(shù)來創(chuàng)建一個接受命令的OpenGL ES 上下文和一個幀緩存區(qū)梯啤,其中寫入所有繪圖命令的結(jié)果。
在iOS中使用OpenGL ES需要使用iOS類來設(shè)置和呈現(xiàn)繪圖表面存哲,并使用平臺中立的API來呈現(xiàn)其內(nèi)容因宇。