歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

-------------------------------------分割線-------------------------------------

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm

Copyright © Linux教程網 All Rights Reserved