简单的OpengGL ES 的使用
来源:互联网 发布:python正则表达式语法 编辑:程序博客网 时间:2024/05/22 03:35
GLKViewController类是支持OpenGL ES特有的行为和动画计时的UIViewController的内建子类。
GLKView 这是cocoa Touch UIView的的内建子类。GLKView简化了通过用 Core Animation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。
GLKBaseEffect是GLKit提供的另一个内建类。GLKBaseEffect的存在是为了简化OpenGL ES的很多常用操作 GLKBaseEffect隐藏了iOS设备支持的多个OpenGL ES版本之间的 差异。在应用中使用GLKBaseEffet能减少需要编写的代码量。
直接上代码:
#import <GLKit/GLKit.h>
@interface OpenGLESViewController : GLKViewController
{
GLuint vertexBufferID;
}
@property (strong, nonatomic) GLKBaseEffect *baseEffect;
@end
/////////////////
#import "OpenGLESViewController.h"
@implementation OpenGLESViewController
@synthesize baseEffect;
typedef struct {
GLKVector3 positionCoords;
}
SceneVertex;
static const SceneVertex vertices[] =
{
{{-0.5f, -0.5f,0.0}},
{{ 0.5f, -0.5f,0.0}},
{{-0.5f, 0.5f,0.0}}
};
- (void)viewDidLoad
{
[superviewDidLoad];
GLKView *view = (GLKView *)self.view;
NSAssert([viewisKindOfClass:[GLKViewclass]],
@"View controller's view is not a GLKView");
// 初始化一个内建的EGALContext实例,这个实例会封装一个特定于某个平台的OpenGL ES上下文
view.context = [[EAGLContextalloc]
initWithAPI:kEAGLRenderingAPIOpenGLES2];
//设置接下来会用的OpenGL ES上下文
[EAGLContext setCurrentContext:view.context];
self.baseEffect = [[GLKBaseEffectalloc]init];
self.baseEffect.useConstantColor =GL_TRUE;
self.baseEffect.constantColor =GLKVector4Make(
0.8f, // Red
1.0f, // Green
1.0f, // Blue
1.0f);// Alpha
glClearColor(0.9f,0.0f,0.0f,1.0f);// background color
glGenBuffers(1, // STEP 1第一个参数表示生成缓存标识符的数量
&vertexBufferID); //当前情况下,标示符被生成,并保存在vertexBufferID中
glBindBuffer(GL_ARRAY_BUFFER, // STEP 2 指定标示符缓存到当前缓存,同一时刻每种类型智能绑定一种缓存
vertexBufferID); //目前只支持2种类型的缓存 GL_ARRAY_BUFFER用于指定一个顶点属性数组
glBufferData( // STEP 3复制应用顶点数数据到当前上下文所绑定的顶点缓存中
GL_ARRAY_BUFFER, //用于指定要更新当前上下文所绑定的哪一个缓存
sizeof(vertices),// 指定要复制的这个缓存的字节大小
vertices, // 要复制缓存的字节地址
GL_STATIC_DRAW); // 提示了缓存在未来的运算中可能将会被怎样使用
// GL_STATIC_DRAW提示会告诉上下文,缓存中的内容适合复制到GPU控制的内存,
//因为很少对其进行修改这个信息会帮助OpenGl优化内存的使用。使用GL_DYNAMIC_DRAW作为提示会告诉上下文,缓存内的数据会频繁改变,同时提示OpengGL ES以不同的方式处理缓存的存储。
}
/**
每当一个GLKView实例需要被重绘时,他都会让保存在视图的上下文属性中的OpenGL ES上下文为当前上下文
*/
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
[self.baseEffectprepareToDraw];
glClear(GL_COLOR_BUFFER_BIT);//设置当前绑定的帧缓存的像素颜色渲染缓存中的每一个像素颜色为前面使用
// glClearColor函数设定的值
glEnableVertexAttribArray( // STEP 4 启动顶点缓存渲染操作 OpenGL ES所支持的每一个
GLKVertexAttribPosition); //渲染操作都可以单独的使用保存在当前OpenGL ES上下文中设置来开启或者关闭
/**
* glVertexAttribPointer 函数会告诉OpenGL ES顶点数据在哪里,以及怎么解释为每个顶点保存数据
*
*/
glVertexAttribPointer( // STEP 5
GLKVertexAttribPosition, //指示当前绑定的缓存包含每个顶点的位置信息。
3, // 每个位置有3个部分(这里指即有三个坐标值)
GL_FLOAT, // 每个部分(坐标)都是浮点型
GL_FALSE, // 告诉OpenGL ES小数点固定数据是否可以被改变
sizeof(SceneVertex),// sizeof(GLKVector)指示在缓存中没有额外的字
// 节。即顶点数据是密封的。
NULL); //告诉OpengGL ES可以从当前绑定的顶点缓存的 开始位置访问顶点数据
glDrawArrays(GL_TRIANGLES, // STEP 6 告诉GPU怎么处理在绑定的顶点缓存内的顶点数据
0, //指定需要渲染第一点的位置
3);// 指定需要渲染的顶点的数量
}
/////////////////////////////////////////////////////////////////
// 在试图控制器最终被卸载的时候被调用,卸载的视图将不再被绘制,因此任何只是在绘制时需要的OpenGL ES缓存都可以安全地删除所以第七步是删除不再需要的顶点缓存和上下文
- (void)viewDidUnload
{
[superviewDidUnload];
GLKView *view = (GLKView *)self.view;
[EAGLContext setCurrentContext:view.context];
// 设置vertexBufferID为0是避免在对应的缓存被删除以后还使用其无效的标示符。
if (0 !=vertexBufferID)
{
glDeleteBuffers (1, // STEP 7
&vertexBufferID);
vertexBufferID = 0;
}
//设置视图的上下文属性为nil并设置当前上下文为nil,以便让cocoa touch收回所有上下文的内存和其他资源
((GLKView *)self.view).context =nil;
[EAGLContextsetCurrentContext:nil];
}
@end
欢迎转载~~~
代码地址 http://download.csdn.net/detail/u011883764/7024503
- 简单的OpengGL ES 的使用
- Android-使用OpengGL实现的Canvas进行绘制(简单介绍)
- OpengGL ES的内存贴图(从界面取贴图)
- OpengGL ES基础入门三 着色器的介绍
- openggl 的神奇
- 《iOS 上的 OpengGL ES 开发》(Learning OpenGL ES for iOS A Hands-on Guide to Modern 3D Graphics Programming
- 《iOS 上的 OpengGL ES 开发》(Learning OpenGL ES for iOS A Hands-on Guide to Modern 3D Graphics Programming
- vs2013中配置OpengGL的编程环境
- OpengGL绘制立方体的三种方法
- OpengGL第八版的第一个例子
- es搜索引擎的使用
- 如何在C++ Builder 6.0(bcb6.0)下使用OpengGL的glut库
- 关于使用androidstudio2.2通过CMake,NDK开发OpengGL程序中出现的extern “C”问题
- 一个OpenGL ES 的简单使用例子代码
- Elasticsearch简单使用系列--详细介绍ES的核心概念
- android使用opensl es进行简单的音频播放
- OpengGL ES 背面剪裁和卷绕
- opengl es 的EGL使用
- 那个房间他已经体验空间
- ios7的UITableVIew按字母排序的索引怎么改成背景是透明的?
- 我不小心删除了一个文件夹没有清空回收站怎么找回
- popToViewController用法
- [下载] VMware Workstation v10.0.1官方简体中文版(附永久KEY注册密钥)
- 简单的OpengGL ES 的使用
- Rpc Call Proxy
- 浅谈Gvim文件管理器NerdTree
- 【Kettle从零开始】第十弹之Kettle运行日志介绍
- HashMap,HashTable,LinkedHashMap,TreeMap的区别和联系
- 经常性无法访问某些国内网站的问题(by quqi99)
- (intermediate) UVA 带下界的网络流 1369 - Travel
- 淡淡的心灵是一杯茶
- iOS--图片缩放