所谓顶点缓冲就是直接将顶点数据存储在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];
// 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]; }@endOpenGL编程指南(原书第7版)中文扫描版PDF 下载 http://www.linuxidc.com/Linux/2012-08/67925.htm-------------------------------------分割线-------------------------------------OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htmUbuntu 13.04 安装 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htmOpenGL三维球体数据生成与绘制【附源码】 http://www.linuxidc.com/Linux/2013-04/83235.htmUbuntu下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本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-11/124806.htm