zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    指针2
    学习笔记day3
    学习笔记day2
    学习笔记day1
    lighttpd启用支持IPv6
    GPL/widedhcpv6/dhcp6c源代码分析
    有多个vsftpd进程运行
    Java学习笔记day1
    python_day4
    python_day3.2
  • 原文地址:https://www.cnblogs.com/salam/p/4937617.html
Copyright © 2011-2022 走看看