http://cowboy.1988.blog.163.com/blog/static/751057982014380251300/

opengl中VAO,VBO,IBO用法小结

这三个玩意全面取代旧社会的glBegin/glEnd,显示列表,顶点数组。

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。

最新文章

  1. 【转载】Keil中的USE MicroLib说明
  2. 【JAVA解析XML文件实现CRUD操作】
  3. Can't get WebApplicationContext object from ContextRegistry.GetContext(): Resource handler for the 'web' protocol is not defined
  4. jvm内存模型和内存分配
  5. C# Socket编程(5)使用TCP Socket
  6. 关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊
  7. org.springframework.beans.BeanUtils
  8. oracle创建表空间,用户,授权等
  9. LeetCode_N-Queens
  10. kaggle之电影评论文本情感分类
  11. csrf学习笔记
  12. 模式识别笔记4-集成学习之AdaBoost
  13. Android使用scrollview截取整个的屏幕并分享微信
  14. AdminLTE 前端框架
  15. hdu1003 Max Sum(最大子串)
  16. 使用jQuery+huandlebars遍历数组嵌套数组
  17. Centos6下关于系统用户密码规则-运维笔记
  18. BZOJ4541 HNOI2016矿区(平面图转对偶图)
  19. lua函数定义
  20. Spring学习(五)——集成MyBatis

热门文章

  1. 【bzoj3675】[Apio2014]序列分割 斜率优化dp
  2. spring3创建RESTFul Web Service
  3. 7月14号day6总结
  4. 培训补坑(day2:割点与桥+强联通分量)
  5. sqlalchemy多表查询
  6. gluPerspective(解释得很好)
  7. selenium运行js下载文书网的文件
  8. Fiddler抓包3-查看get与post请求【转载】
  9. js正则常用的一些东西
  10. [BZOJ1295][SCOI2009]最长距离 最短路+枚举