• opengl中VAO,VBO,IBO用法小结(zz) 【转】


    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。

  • 相关阅读:
    洛谷P1033 自由落体 题解
    尴尬
    UVA11988 【Broken Keyboard (a.k.a. Beiju Text)】:题解
    UVA101 The Blocks Problem 题解
    TCP的粘包和拆包问题及解决办法(C#)
    MIPS学习笔记(一)
    MySQL基础(一)
    博客园的标签怎么变了两下???
    nextInt()和nextLine()连用报错
    C++代码雨
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/6547263.html
Copyright © 2020-2023  润新知