opengl中VAO,VBO,IBO用法小结
2012-12-07 14:44
375 查看
这三个玩意全面取代旧社会的glBegin/glEnd,显示列表,顶点数组。
VBO为顶点缓冲区对象,用于存储顶点坐标/顶点uv/顶点法线/顶点颜色,也可以用于其他用途,比如tangent。
IBO为索引缓冲区,里面的值可以是unsigned int或者unsigned short。
最后用VAO将多个VBO,IBO绑定到一起。
一个常规的网格模型就是VAO.attach(PositionVBO,TexcoordVBO,NormalVBO,IBO)
以下为VBO的创建,分配100字节的空间,未初始化:
以下为IBO的创建,分配100字节的空间,未初始化:
以下为VAO的创建:
以下用VAO绑定VBO与IBO,
vt指绑定到的顶点着色器的input,通过glBindAttribLocation预先绑定
vs指该vbo中顶点的成分数,比如法线为3个float,uv为2个float
以下是绘制VAO,其中num为顶点数量。
以下是向VBO提交数据,无论提交全部还是部分都用这个,ibo类似
以下为从VBO读取数据,虽然该行为也能提交数据,但不推荐
可以用glBufferData重新分配空间,相当于c++的delete/new操作。
需要特别注意的是,在stackoverflow发现了这句话,如果你的VAO不能绘制出东西:
If you're on OpenGL-4 core, you need to create a VAO first, otherwise nothing will draw。
VBO为顶点缓冲区对象,用于存储顶点坐标/顶点uv/顶点法线/顶点颜色,也可以用于其他用途,比如tangent。
IBO为索引缓冲区,里面的值可以是unsigned int或者unsigned short。
最后用VAO将多个VBO,IBO绑定到一起。
一个常规的网格模型就是VAO.attach(PositionVBO,TexcoordVBO,NormalVBO,IBO)
以下为VBO的创建,分配100字节的空间,未初始化:
GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER,100,0,GL_STATIC_DRAW);
以下为IBO的创建,分配100字节的空间,未初始化:
GLuint ibo; glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER,100,0,GL_STATIC_DRAW);
以下为VAO的创建:
GLuint vao; glGenVertexArrays(1,&vao); glBindVertexArray(vao);
以下用VAO绑定VBO与IBO,
vt指绑定到的顶点着色器的input,通过glBindAttribLocation预先绑定
vs指该vbo中顶点的成分数,比如法线为3个float,uv为2个float
GLuint vt=0; GLuint vs=3; glBindVertexArray(vao); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBindBuffer(GL_ARRAY_BUFFER,vbo); glEnableVertexAttribArray(vt); glVertexAttribPointer(vt,vs,GL_FLOAT,GL_FALSE,0,0);
以下是绘制VAO,其中num为顶点数量。
int num=50; glBindVertexArray(vao); if(ibo){ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo); glDrawElements(GL_TRIANGLES,num, GL_UNSIGNED_INT, 0); }else{ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); glBindBuffer(GL_ARRAY_BUFFER,vbo); glDrawArrays(GL_TRIANGLES,0,num); }
以下是向VBO提交数据,无论提交全部还是部分都用这个,ibo类似
glBindBuffer(GL_ARRAY_BUFFER,vbo); glBufferSubData(GL_ARRAY_BUFFER,size,len,src);
以下为从VBO读取数据,虽然该行为也能提交数据,但不推荐
float* data=(float*)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_ONLY); memcpy(dest,data,mSize); glUnmapBuffer(GL_ARRAY_BUFFER);
可以用glBufferData重新分配空间,相当于c++的delete/new操作。
需要特别注意的是,在stackoverflow发现了这句话,如果你的VAO不能绘制出东西:
If you're on OpenGL-4 core, you need to create a VAO first, otherwise nothing will draw。
相关文章推荐
- opengl中VAO,VBO,IBO用法小结(zz) 【转】
- opengl中VAO,VBO,IBO用法小结
- opengl中VAO,VBO,IBO用法小结【转】
- opengl中VAO,VBO,IBO用法小结(zz)
- OpenGL学习笔记(三):了解管线、VAO、VBO的关系,介绍Qt如何使用OpenGL
- OpenGL中VBO及VAO区别
- OpenGL——VAO,VBO,EBO等对象的使用
- OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口
- 开始opengl第八版-1.VAO与VBO
- opengl VAO ,VBO
- OpenGL(二十四) VAO、VBO和着色器使用示例
- opengl VAO and VBO
- 【OpenGL】VAO与VBO
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- opengl-vao-vbo
- OpenGL VAO, VBO 使用简介
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
- OpenGL中的VAO与VBO