转载

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之顶点缓冲

正文到此结束
Loading...