臨近年底,把這一年用到的OpenGL ES(側重于iOS)相關的技術做一個總結。為圖連貫,故把之前的文章整合在了一起,從最基礎開始講起。
一、OpenGL ES簡介
OpenGL(Open Graphics Library)API是指定義了一個跨編程語言、跨平臺的編程接口規格的專業的圖形程序接口。它用于三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。
注:OpenGL是Khronos Group開發維護的一個規范,本身不是API。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和游戲主機等嵌入式設備而設計。(OpenGL ES可以在iOS上實現2D和3D圖形編程。)
在學習OpenGL的過程中可以了解到很多圖形學基本概念。
OpenGL ES 1.0、2.0、3.0的區別:
OpenGL ES1.0:
針對固定管線硬件(fixed pipeline),通過它內建的functions來設置諸如燈光、vertexes(圖形的頂點數)、顏色、camera等等的東西。
OpenGL ES2.0:
針對可編程管線硬件(programmable pipeline),需要自己動手編寫任何功能。與此同時,2.0相比于1.0更具靈活性,功能也更強大。可以自定義頂點和像素計算,可以讓表現方式更加準確。
OpenGL ES3.0:
OpenGL ES3.0擴展了OpenGL ES2.0,支持許多新的渲染技術、優化和顯示質量改進,包括——引入了許多和紋理相關的新功能,對著色語言進行了重大更新和支持著色器新功能的API特性,引入了多種與幾何形狀規范和圖元渲染控制相關的新功能,引入了新的緩沖區對象,增添了許多與屏幕外渲染到幀緩沖區對象相關的新功能。具體功能在后邊的文章詳細說明。(可能:))
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)和原生窗口系統之間的接口(在iOS上則是EAGL),任何OpenGL ES應用程序都必須在開始渲染之前使用EGL執行如下任務:
- 查詢并初始化設備商可用的顯示器
- 創建渲染表面
- 創建渲染上下文
OpenGL ES 3.0圖形管線的各個階段
二、在Xcode搭建OpenGL ES
創建一個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");
}
//設置渲染表面
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方法
(實現GLKViewDelegate的Required方法)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); //設置清除顏色
glClear(GL_COLOR_BUFFER_BIT); //清除顏色緩沖區
}
此外,在Main.storyboard中將View Controller的View的Class設置為GLKView。
Run一下這個工程,最后得到下圖效果。
注:部分內容出自OpenGL超級寶典(藍寶書)。