臨近年底炼鞠,把這一年用到的OpenGL ES(側(cè)重于iOS)相關(guān)的技術(shù)做一個總結(jié)缘滥。為圖連貫,故把之前的文章整合在了一起谒主,從最基礎(chǔ)開始講起朝扼。
一、OpenGL ES簡介
OpenGL(Open Graphics Library)API是指定義了一個跨編程語言霎肯、跨平臺的編程接口規(guī)格的專業(yè)的圖形程序接口擎颖。它用于三維圖像(二維的亦可),是一個功能強(qiáng)大观游,調(diào)用方便的底層圖形庫肠仪。
注:OpenGL是Khronos Group開發(fā)維護(hù)的一個規(guī)范,本身不是API异旧。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機(jī)提佣、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計。(OpenGL ES可以在iOS上實現(xiàn)2D和3D圖形編程。)
在學(xué)習(xí)OpenGL的過程中可以了解到很多圖形學(xué)基本概念。
OpenGL ES 1.0张症、2.0仓技、3.0的區(qū)別:
OpenGL ES1.0:
針對固定管線硬件(fixed pipeline),通過它內(nèi)建的functions來設(shè)置諸如燈光俗他、vertexes(圖形的頂點數(shù))脖捻、顏色、camera等等的東西兆衅。
OpenGL ES2.0:
針對可編程管線硬件(programmable pipeline)地沮,需要自己動手編寫任何功能。與此同時涯保,2.0相比于1.0更具靈活性诉濒,功能也更強(qiáng)大∠Υ海可以自定義頂點和像素計算未荒,可以讓表現(xiàn)方式更加準(zhǔn)確。
OpenGL ES3.0:
OpenGL ES3.0擴(kuò)展了OpenGL ES2.0及志,支持許多新的渲染技術(shù)片排、優(yōu)化和顯示質(zhì)量改進(jìn),包括——引入了許多和紋理相關(guān)的新功能速侈,對著色語言進(jìn)行了重大更新和支持著色器新功能的API特性率寡,引入了多種與幾何形狀規(guī)范和圖元渲染控制相關(guān)的新功能,引入了新的緩沖區(qū)對象倚搬,增添了許多與屏幕外渲染到幀緩沖區(qū)對象相關(guān)的新功能冶共。具體功能在后邊的文章詳細(xì)說明。(可能:))
OpenGL ES 3.0的向后兼容新
OpenGL ES 3.0向后兼容OpenGL ES 2.0每界,但由于3.0/2.0不支持1.x支持的固定功能管線捅僵,3.0/2.0不能向后兼容1.x。
EGL/EAGL
EGL是Khronos渲染API(如OpenGL ES)和原生窗口系統(tǒng)之間的接口(在iOS上則是EAGL)眨层,任何OpenGL ES應(yīng)用程序都必須在開始渲染之前使用EGL執(zhí)行如下任務(wù):
- 查詢并初始化設(shè)備商可用的顯示器
- 創(chuàng)建渲染表面
- 創(chuàng)建渲染上下文
OpenGL ES 3.0圖形管線的各個階段
二庙楚、在Xcode搭建OpenGL ES
創(chuàng)建一個iOS工程。
在Build Phases下選擇Link Binary With Libraries趴樱,點擊+馒闷,添加GLKit.framework。
ViewController.h文件
#import <GLKit/GLKit.h>叁征。
將@interface ViewController : UIViewController修改為@interface ViewController : GLKViewController纳账。
ViewController.m文件
#import <OpenGLES/ES3/glext.h>。
在viewDidLoad方法中添加代碼
//初始化上下文
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
if (!self.context) {
NSLog(@"Failed to create ES context");
}
//設(shè)置渲染表面
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[self setupGL];
setupGL方法
- (void)setupGL {
[EAGLContext setCurrentContext:self.context];
}
添加- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect方法
(實現(xiàn)GLKViewDelegate的Required方法)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); //設(shè)置清除顏色
glClear(GL_COLOR_BUFFER_BIT); //清除顏色緩沖區(qū)
}
此外航揉,在Main.storyboard中將View Controller的View的Class設(shè)置為GLKView塞祈。
Run一下這個工程,最后得到下圖效果帅涂。
注:部分內(nèi)容出自O(shè)penGL超級寶典(藍(lán)寶書)议薪。