- 简介
- VBO相关函数
| glGenBuffers | 创建顶点缓冲区对象 |
| glBindBuffer | 将顶点缓冲区对象设置为当前数组缓冲区对象(array buffer object)或当前元素(索引)缓冲区对象(element buffer object) |
| glBufferData | 为顶点缓冲区对象申请内存空间,并进行初始化(视传入的参数而定) |
| glBufferSubData | 初始化或更新顶点缓冲区对象 |
| glDeleteBuffers | 删除顶点缓冲区对象 |
- 创建VBO
void glGenBuffers (GLsizei n, GLuint * buffers);这个函数创建了新的缓冲区对象,并且返回这些对象的ID值,第一个参数是希望创建多少个缓冲区对象,第二个参数是传入接收这些对象ID的地址(如果是多个需要传入数组)
void glBindBuffer (GLenum target,GLuint buffer);
当我们创建好缓冲区对象之后,在使用之前需要先将该缓冲区对象设置为当前缓冲区对象(OpenGL是一个状态机,使用它的方式都是先切换在使用)。第一个参数是说明这个缓冲区是用来存储什么东西的。可以是存储顶点数组(GL_ARRAY_BUFFER) 或者是索引数组(GL_ELEMENT_ARRAY_BUFFER)。
void glBufferData(
GLenum target,
GLsizeiptr size,
const GLvoid * data,
GLenum usage);
当缓冲区初始化完成之后,可以使用glBufferData往里面写入数据。
GL_STATIC_DRAW_ARB
GL_STATIC_READ_ARB
GL_STATIC_COPY_ARB
GL_DYNAMIC_DRAW_ARB
GL_DYNAMIC_READ_ARB
GL_DYNAMIC_COPY_ARB
GL_STREAM_DRAW_ARB
GL_STREAM_READ_ARB
GL_STREAM_COPY_ARB”STATIC“开头的单词意味着VBO中的数据不会变化(一次赋值多次使用)。
void glBufferSubData(
GLenum target,
GLintptr offset,
GLsizeiptr size,
const GLvoid * data);
这个函数和glBufferData的作用有点类似,主要是向VBO中写入数据,但是它只是替换VBO中的一部分数据,另外在使用它之前的缓冲区对象必须先使用过glBufferData写入过全部的数据。(也就是说glBufferSubData不能更新一个全新的缓冲区对象[仅仅使用glBindBuffer,还未使用glBufferData写入的缓冲区])
void glDeleteBuffers( GLsizei n,
const GLuint * buffers);函数很好理解,既然glGenBuffers控制生,那么glDeleteBuffer就是控制死了。参数含义与glGenBuffers一样。回收缓冲区对象。
- 使用方式
GLuint vboId; // 声明一个VBO的ID值
GLfloat* vertices = new GLfloat[vCount*3]; // 存放VBO数据的数组(内存中)
// 新建缓冲区对象,并使用vboId来保存这个缓冲区的ID
glGenBuffers(1, &vboId);
// 绑定缓冲区对象,作为数据数组使用
glBindBuffer(GL_ARRAY_BUFFER_ARB, vboId);
// 写入内存中的数据到缓冲区对象中
glBufferData(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);
// 当拷贝数据到缓冲区对象中之后,内存中的数组对象可以安全的被释放
delete [] vertices;
// 程序结束后删除缓冲区对象(回收缓冲区以备之后使用)
glDeleteBuffers(1, &vboId);
- 示例
- 更新VBO
void * glMapBuffer( GLenum target,
GLenum access);
如果调用成功,会返回映射内存区的指针,失败返回NULL。
GL_READ_ONLY
GL_WRITE_ONLY
GL_READ_WRITE另一个与之对应的API是
GLboolean glUnmapBuffer( GLenum target);
当修改完VBO中的数据之后,必须调用Unmap函数解绑客户端的内存,如果成功返回GL_TRUE,失败返回GL_FALSE,如果返回GL_FALSE,说明VBO中的数据出现问题,需要重新发送数据。
3710



被折叠的 条评论
为什么被折叠?



