当前位置: 代码迷 >> Iphone >> OpenGL ES 3.0之极点缓冲
  详细解决方案

OpenGL ES 3.0之极点缓冲

热度:629   发布时间:2016-04-25 05:29:47.0
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