设为首页 加入收藏

TOP

OpenGL ES 3.0之顶点缓冲(一)
2015-11-10 13:45:02 来源: 作者: 【 】 浏览:8
Tags:OpenGL 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);

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java 构造函数内部的多态方法 完.. 下一篇Java对象初始化

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: