OpenGL ES 3.0之顶点缓冲

所谓顶点缓冲就是直接将顶点数据存储在gpu的一段缓冲区,不需要从cpu拷贝到gpu。提高了程序的运行效率。

操作步骤

1.创建顶点缓冲对象

GLuint vertexBufferID;

2.分配空间

glGenBuffers(1,  &vertexBufferID);

3.绑定当前顶点缓冲对象

glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);

4.初始化缓冲区数据

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,  GL_STATIC_DRAW);

5.启用顶点属性数组

glEnableVertexAttribArray(GLKVertexAttribPosition);

6.使用顶点数据进行渲染

glVertexAttribPointer(
      GLKVertexAttribPosition,
      3, 
      GL_FLOAT,
      GL_FALSE,
      sizeof(SceneVertex),
      NULL);

7.绘制  

glDrawArrays(GL_TRIANGLES, 0,3);

下面赋全部代码

@interface OpenGLESViewController : GLKViewController
{
  GLuint vertexBufferID;
}

@property (strong, nonatomic) GLKBaseEffect *baseEffect;

@end

 

#import "OpenGLESViewController.h"

@implementation OpenGLESViewController

@synthesize baseEffect;

/////////////////////////////////////////////////////////////////
// This data type is used to store information for each vertex
typedef struct {
  GLKVector3  positionCoords;
}
SceneVertex;

// Define vertex data for a triangle to use in example
static const SceneVertex vertices[] =
{
  {{-0.5f, -0.5f, 0.0}}, // lower left corner
  {{ 0.5f, -0.5f, 0.0}}, // lower right corner
  {{-0.5f,  0.5f, 0.0}}  // upper left corner
};


/////////////////////////////////////////////////////////////////
// Called when the view controller's view is loaded
// Perform initialization before the view is asked to draw
- (void)viewDidLoad
{
  [super viewDidLoad];
 
  // Verify the type of view created automatically by the
  // Interface Builder storyboard
  GLKView *view = (GLKView *)self.view;
  NSAssert([view isKindOfClass:[GLKView class]],
      @"View controller's view is not a GLKView");
 
  // Create an OpenGL ES 2.0 context and provide it to the
  // view
  view.context = [[EAGLContext alloc]
      initWithAPI:kEAGLRenderingAPIOpenGLES2];
 
  // Make the new context current
  [EAGLContext setCurrentContext:view.context];
 
  // Create a base effect that provides standard OpenGL ES 2.0
  // Shading Language programs and set constants to be used for
  // all subsequent rendering
  self.baseEffect = [[GLKBaseEffect alloc] init];
  self.baseEffect.useConstantColor = GL_TRUE;
  self.baseEffect.constantColor = GLKVector4Make(
      1.0f, // Red
      1.0f, // Green
      1.0f, // Blue
      1.0f);// Alpha
 
  // Set the background color stored in the current context
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // background color
 
  // Generate, bind, and initialize contents of a buffer to be
  // stored in GPU memory
  glGenBuffers(1,                // STEP 1
      &vertexBufferID);
  glBindBuffer(GL_ARRAY_BUFFER,  // STEP 2
      vertexBufferID);
  glBufferData(                  // STEP 3
      GL_ARRAY_BUFFER,  // Initialize buffer contents
      sizeof(vertices), // Number of bytes to copy
      vertices,        // Address of bytes to copy
      GL_STATIC_DRAW);  // Hint: cache in GPU memory
}


/////////////////////////////////////////////////////////////////
// GLKView delegate method: Called by the view controller's view
// whenever Cocoa Touch asks the view controller's view to
// draw itself. (In this case, render into a frame buffer that
// shares memory with a Core Animation Layer)
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
  [self.baseEffect prepareToDraw];
 
  // Clear Frame Buffer (erase previous drawing)
  glClear(GL_COLOR_BUFFER_BIT);
 
  // Enable use of positions from bound vertex buffer
  glEnableVertexAttribArray(      // STEP 4
      GLKVertexAttribPosition);
     
  glVertexAttribPointer(          // STEP 5
      GLKVertexAttribPosition,
      3,                  // three components per vertex
      GL_FLOAT,            // data is floating point
      GL_FALSE,            // no fixed point scaling
      sizeof(SceneVertex), // no gaps in data
      NULL);              // NULL tells GPU to start at
                          // beginning of bound buffer
                                 
  // Draw triangles using the first three vertices in the
  // currently bound vertex buffer
  glDrawArrays(GL_TRIANGLES,      // STEP 6
      0,  // Start with first vertex in currently bound buffer
      3); // Use three vertices from currently bound buffer
}


/////////////////////////////////////////////////////////////////
// Called when the view controller's view has been unloaded
// Perform clean-up that is possible when you know the view
// controller's view won't be asked to draw again soon.
- (void)viewDidUnload
{
  [super viewDidUnload];
 
  // Make the view's context current
  GLKView *view = (GLKView *)self.view;
  [EAGLContext setCurrentContext:view.context];
   
  // Delete buffers that aren't needed when view is unloaded
  if (0 != vertexBufferID)
  {
      glDeleteBuffers (1,          // STEP 7
                      &vertexBufferID); 
      vertexBufferID = 0;
  }
 
  // Stop using the context created in -viewDidLoad
  ((GLKView *)self.view).context = nil;
  [EAGLContext setCurrentContext:nil];
}

@end

OpenGL ES 3.0之顶点缓冲

-------------------------------------分割线-------------------------------------

相关推荐