简单的OpengGL ES 的使用

来源:互联网 发布:python正则表达式语法 编辑:程序博客网 时间:2024/05/22 03:35

    GLKViewController类是支持OpenGL ES特有的行为和动画计时的UIViewController的内建子类。

    GLKView 这是cocoa Touch UIView的的内建子类。GLKView简化了通过用 Core Animation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。

    GLKBaseEffectGLKit提供的另一个内建类。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.5f0.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];

    

   // 设置vertexBufferID0是避免在对应的缓存被删除以后还使用其无效的标示符。

   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 

0 0