- 注册时间
- 2004-8-26
- 最后登录
- 1970-1-1
|
Vertex Buffer Object(以下简称VBO) 是OpenGL扩展中最重要的一块,也是必备的基础、实现其他扩展的前提。
VBO原理上相当于DirectX的VertexBuffer,作用就是将顶点数据保存到VRAM(或者AGP),实现高速绘图。
当然,两者在实现方法上有一定区别。另外,在实际应用中,VBO的效率要略低于VertexBuffer。
一、VBO扩展说明
[参见glext.h中的定义]
扩展函数原形:- void glBindBufferARB(GLenum target, GLuint buffer);
- void glDeleteBuffersARB(GLsizei n, const GLuint *buffers);
- void glGenBuffersARB(GLsizei n, GLuint *buffers);
- boolean glIsBufferARB(GLuint buffer);
- void glBufferDataARB(GLenum target, GLsizeiptr size, const GLvoid *data,
- GLenum usage);
- void glBufferSubDataARB(GLenum target, GLintptr offset, GLsizeiptr size,
- const GLvoid *data);
- void glGetBufferSubDataARB(GLenum target, GLintptr offset,
- GLsizeiptr size, GLvoid *data);
- void *glMapBufferARB(GLenum target, GLenum access);
- boolean glUnmapBufferARB(GLenum target);
- void glGetBufferParameterivARB(GLenum target, GLenum pname, GLint *params);
- void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params);
复制代码 扩展常数:- target常数:
- GL_ARRAY_BUFFER_ARB
- GL_ELEMENT_ARRAY_BUFFER_ARB
- pname常数(用于GetBufferParameterivARB):
- GL_BUFFER_SIZE_ARB
- GL_BUFFER_USAGE_ARB
- GL_BUFFER_ACCESS_ARB
- GL_BUFFER_MAPPED_ARB
- pname常数(用于GetBufferPointervARB):
- GL_BUFFER_MAP_POINTER_ARB
- usage常数:
- GL_STREAM_DRAW_ARB
- GL_STREAM_READ_ARB
- GL_STREAM_COPY_ARB
- GL_STATIC_DRAW_ARB
- GL_STATIC_READ_ARB
- GL_STATIC_COPY_ARB
- GL_DYNAMIC_DRAW_ARB
- GL_DYNAMIC_READ_ARB
- GL_DYNAMIC_COPY_ARB
- access常数:
- GL_READ_ONLY_ARB
- GL_WRITE_ONLY_ARB
- GL_READ_WRITE_ARB
复制代码
二、VBO的创建和销毁
VBO是通过绑定ID的方式来创建的,使用BindBufferARB函数:
void BindBufferARB(enum target, uint buffer);
上述buffer ID可由用户直接指定,也可以通过GenBuffersARB函数获得,其作用是获得空闲的ID序列:
void GenBuffersARB(sizei n, uint *buffers);
VBO创建之后,在程序结束时(或不再需要这个VBO时),需用DeleteBuffersARB将其销毁:
void DeleteBuffersARB(sizei n, const uint *buffers);
三、VBO数据的初始化和修改
通过BindBufferARB创建并绑定VBO之后,需要使用BufferDataARB函数对VBO内的数据进行初始化:
void glBufferDataARB(GLenum target, GLsizeiptr size, const GLvoid *data,
GLenum usage);
[详解] size为VBO缓冲区大小,data指向顶点数据的起始地址(用于初始化VBO数据。当data为NULL时,则不初始化顶点数据,仅划分相应的缓冲区空间),usage各常数效果如下:
STREAM_DRAW_ARB:VBO只初始化一次,并且只能使用少数几次。
STATIC_DRAW_ARB:VBO只初始化一次,并且可多次使用。
DYNAMIC_DRAW_ARB:VBO可初始化多次,并且可多次使用。
(DRAW/READ/COPY涉及到VBO数据存放的位置,将在后面再作详细讨论。)
[实例] VBO的创建、初始化和销毁- GLuint nBufferID;
- //获得一个空闲的buffer ID:
- glGenBuffersARB(1, &nBufferID);
- //绑定buffer ID:
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, nBufferID);
- //初始化VBO:
- glBufferDataARB(GL_ARRAY_BUFFER_ARB, 200, NULL, DYNAMIC_DRAW_ARB);
- ....
- //销毁VBO:
- glDeleteBuffersARB(1, &nBufferID);
复制代码
未完,待续。
原文:http://emsky.net/lendy/blog/article.asp?id=24 |
|