今天写个小案例,体验下opengles加载图片,这可不像iOS里[UIImage imageWithName:@""]那样方便。我们这里会用到GLKit、OpenGLES框架,这些是苹果封装好的,里面有些东西方便我们使用
EAGLContext:opengl的上下文,用于配置信息和渲染使用,如果只看api看不出什么,在EAGLDrawable.h中还有他的扩展类,用于绑定buffer和渲染buffer使用
GLKBaseEffect:基础着色器,苹果封装好的,用于加载着色器文件,提供光照,纹理,矩阵变换
下面我们创建一个工程Single View App,在ViewController.h引入#import <GLKit/GLKit.h>,继承GLKViewController,将Main.stroyboard里的view改成GLKView


在ViewController.m中继承<GLKViewDelegate>协议,重写协议里glkView:(GLKView *)view drawInRect:(CGRect)rect方法,这个是每次重绘的方法。创建两个对象EAGLContext和GLKBaseEffect。

在viewDidLoad里大体可分三部,配置,加载数据,加载着色器,渲染会在drawInRect里。setupGL首先创建EAGLContext指定GLES2版本,将self.view转换为GLKView,指定context,设置drawableColorFormat和drawableDepthFormat,这些是固定格式,设置当前的EAGLContext,开启深度测试(如果视线上的两个物体,深度较深的会被深度浅的遮挡),glClearColor只是把颜色放入缓冲区,并没有真正的清理颜色。

loadPoint设置数据信息,并传递到着色器中


loadEffect基础着色器的加载,加载图片我们需要一个纹理加载器GLKTextureLoader,创建GLKTextureInfo。

这样大体的工作就完成了,在glkView:(GLKView *)view drawInRect:(CGRect)rect里,
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);将颜色缓冲器和深度缓冲区重置,
[effect prepareToDraw];着色器准备绘制
glDrawArrays(GL_TRIANGLES, 0, 6);绘制,第一个是绘制的形状,第二个是buffer中第一个顶点的起始点,第二个是绘制多少点
网友评论