返回

OpenGL-ES-案例06:GLKit使用索引绘图(下)

IOS

前言
上节课我们介绍了OpenGL ES使用索引绘图,这节课我们来看看GLKit中,如何使用索引绘图。GLKit提供了很多方便的接口来帮助我们进行图形编程,下面我们以一个具体的例子来介绍如何使用GLKit来进行索引绘图。

案例效果

本案例的主要目的是理解GLKit中的索引绘图。如果对索引绘图有不了解的,请先看OpenGL ES 案例05:GLSL使用索引绘图文章前半部分,有简要说明。
案例的效果如图所示:

[图片]

整体案例的流程如下:

  1. 首先,我们需要创建一个GLKView对象,并将其添加到视图控制器中。
  2. 然后,我们需要创建一个GLKBaseEffect对象,并将其添加到GLKView对象中。
  3. 接下来,我们需要创建一个顶点数组对象和一个索引数组对象。
  4. 然后,我们需要将顶点数据和索引数据加载到顶点数组对象和索引数组对象中。
  5. 最后,我们需要在GLKView对象的update方法中调用GLKBaseEffect对象的prepareToDraw方法,并在GLKView对象的draw方法中调用GLKBaseEffect对象的draw方法。

代码实现

- (void)viewDidLoad {
    [super viewDidLoad];

    // 创建一个GLKView对象
    GLKView *view = [[GLKView alloc] initWithFrame:self.view.bounds];
    view.backgroundColor = [UIColor blackColor];
    [self.view addSubview:view];

    // 创建一个GLKBaseEffect对象
    GLKBaseEffect *effect = [[GLKBaseEffect alloc] init];
    effect.useConstantColor = YES;
    effect.constantColor = GLKVector4Make(1.0f, 0.0f, 0.0f, 1.0f);

    // 创建一个顶点数组对象和一个索引数组对象
    GLuint vertexArray;
    glGenVertexArraysOES(1, &vertexArray);
    glBindVertexArrayOES(vertexArray);

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    GLuint indexBuffer;
    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    // 启用顶点属性数组
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const void *)offsetof(Vertex, position));

    // 将GLKView对象的context设置为当前context
    [view bindDrawable];

    // 设置视口
    glViewport(0, 0, view.frame.size.width, view.frame.size.height);

    // 清空颜色缓冲区
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // 调用GLKBaseEffect对象的prepareToDraw方法
    [effect prepareToDraw];

    // 调用GLKBaseEffect对象的draw方法
    [effect draw];

    // 解除GLKView对象的context的绑定
    [view unbindDrawable];
}

运行结果

运行效果如图所示:

[图片]

总结

通过本节课的学习,我们已经了解了如何使用GLKit来进行索引绘图。GLKit提供了很多方便的接口来帮助我们进行图形编程,使我们能够更轻松地开发出高性能的图形应用程序。