临近年底,把这一年用到的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超级宝典(蓝宝书)。