今天写个小案例,体验下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
![](https://img.haomeiwen.com/i2216667/1cb80964b9e3a7fc.png)
![](https://img.haomeiwen.com/i2216667/da6046403d6751bc.png)
在ViewController.m中继承<GLKViewDelegate>协议,重写协议里glkView:(GLKView *)view drawInRect:(CGRect)rect方法,这个是每次重绘的方法。创建两个对象EAGLContext和GLKBaseEffect。
![](https://img.haomeiwen.com/i2216667/0e0f7d98e33e3611.png)
在viewDidLoad里大体可分三部,配置,加载数据,加载着色器,渲染会在drawInRect里。setupGL首先创建EAGLContext指定GLES2版本,将self.view转换为GLKView,指定context,设置drawableColorFormat和drawableDepthFormat,这些是固定格式,设置当前的EAGLContext,开启深度测试(如果视线上的两个物体,深度较深的会被深度浅的遮挡),glClearColor只是把颜色放入缓冲区,并没有真正的清理颜色。
![](https://img.haomeiwen.com/i2216667/6b399e26ef5b07fb.png)
loadPoint设置数据信息,并传递到着色器中
![](https://img.haomeiwen.com/i2216667/d6974ff99a32d7df.png)
![](https://img.haomeiwen.com/i2216667/95df6a5a4201a2c0.png)
loadEffect基础着色器的加载,加载图片我们需要一个纹理加载器GLKTextureLoader,创建GLKTextureInfo。
![](https://img.haomeiwen.com/i2216667/4bf3c9b264dea4a5.png)
这样大体的工作就完成了,在glkView:(GLKView *)view drawInRect:(CGRect)rect里,
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);将颜色缓冲器和深度缓冲区重置,
[effect prepareToDraw];着色器准备绘制
glDrawArrays(GL_TRIANGLES, 0, 6);绘制,第一个是绘制的形状,第二个是buffer中第一个顶点的起始点,第二个是绘制多少点
网友评论