你的位置:首页 > 操作系统

[操作系统]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 vertextypedef struct {  GLKVector3 positionCoords;}SceneVertex;// Define vertex data for a triangle to use in examplestatic 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