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。

opengl中VAO,VBO,IBO用法小结(zz) 【转】的更多相关文章

  1. opengl中VAO,VBO,IBO用法小结【转】

    http://cowboy.1988.blog.163.com/blog/static/751057982014380251300/ opengl中VAO,VBO,IBO用法小结 这三个玩意全面取代旧 ...

  2. VAO VBO IBO大乱炖

    最近对程序中绘制卡顿的问题忍无可忍,终于决定下手处理了.程序涉及的绘制比较多,除了点.线.三角形.多边形.圆柱体之外,还有自组格式模型.开始想全部采用显示列表优化,毕竟效率最高,虽然显示列表存在编译之 ...

  3. 1:CSS中一些@规则的用法小结 2: @media用法详解

    第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下     at-rule ...

  4. c#多线程中Lock()关键字的用法小结

    本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助     本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段 ...

  5. go中整型的用法小结

    示例 // 整型的用法小结 // 注意: // 整型变量在使用时,遵循保小不保大的原则 // 尽量使用占用空间小的数据类型 package main import ( "fmt" ...

  6. Android中static和final用法小结

    Java关键字static.final使用小结 static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是 ...

  7. go中指针类型的用法小结

    代码 // 指针的用法 package main import ( "fmt" ) func main() { var i int = 100 // 输出i的地址 fmt.Prin ...

  8. Java中static、final用法小结

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  9. Java中static、final用法小结(转)

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

随机推荐

  1. Chrome浏览器跨域插件

    Moesif Origin & CORS Changer 这个插件允许发送跨域请求,重写Request Origin 和 CORS headers. 解决Debug Javascript时候出 ...

  2. swift关于is和as的解释

    http://tieba.baidu.com/p/3155277323 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如果是返回true,否则返回 ...

  3. HDU1281(二分图最大匹配,棋盘建图,找关键点)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. js 触发LinkButton点击事件,执行后台方法

    页面 <asp:LinkButton ID="lbtButton" runat="server"  CssClass="lbtButton&qu ...

  5. XGBOOST/GBDT,RandomForest/Bagging的比较

    原创文章:http://blog.csdn.net/qccc_dm/article/details/63684453 首先XGBOOST,GBDT,RF都是集成算法,RF是Bagging的变体,与Ba ...

  6. picker鼠标上下拖动选择内容

    上次写这个的时候的博客:http://hiuman.iteye.com/blog/2324929 上次是网上搜的,这次是自己写的. 无论多少个input都可以点击-但是只有一种内容(弹出的内容),可以 ...

  7. 获取struts迭代list在页面显示的数据

    js代码: function modifyPactMoney(){ var table=$("#pactfee"); var trs=table.find("tr&quo ...

  8. IE8的 JS 引擎如此不堪(二) - 解决方案

    上一篇,IE8的JS引擎内存不停增长,是因为动态生成了一个image对象导致的.有了病因,就开始寻找治疗方法. 1.使用一个固定的img对象,但是无法获取地址改变后的图片大小,最总还是放弃: 2.寻找 ...

  9. 51nod 1459 迷宫游戏【最短路拓展】

    1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB   你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连 ...

  10. Python练习——同时安装python2 与 python 3如何选择不同解释器运行脚本

    如果同时安装了python 2 和python 3 那么我们需要在运行时指定解释器 如下: 其中py -2 ex1.py指定了解释器的版本,以及打开的文件 如果使用 py-3 ex1.py则使用了py ...