所谓顶点缓冲就是直接将顶点数据存储在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);