OpenGL的VBO相关操作

144 阅读2分钟

创建与删除VBO

我们可以使用glGenBuffers创建VBO,使用glDeleteBuffers删除VBO。

#define GL_CALL(func) func;checkError();

void prepare()
{
    // 创建一个VBO, 此时还没有真正分配显存
    GLuint vbo = 0;
    GL_CALL(glGenBuffers(1, &vbo));


    // 销毁一个VBO
    GL_CALL(glDeleteBuffers(1, &vbo));


    // 创建n个VBO

    GLuint vboArr[] = {0, 0, 0};
    GL_CALL(glGenBuffers(3, vboArr));


    // 销毁n个VBO

    GL_CALL(glDeleteBuffers(3, vboArr));
}

VBO的绑定与数据更新

绑定:将某个资源与OpenGL状态机中的某个状态插槽进行关联

API功能
glBindBuffer进行VBO绑定,将当前的vbo绑定到OpenGL状态机的哪个状态插槽
glBufferData往VBO中填入数据,此时会申请显存空间

代码


void prepare()
{
    // VBO顶点数据

    float vertices[] = {
       -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f, 0.5f, 0.0f
    };
    // 1, 生成一个VBO
    GLuint vbo = 0;
    glGenBuffers(1, &vbo);

    // 2, 绑定当前VBO到OpenGL的VBO插槽上
    // GL_ARRAY_BUFFER表示当前VBO这个插槽
    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    // 3,向当前VBO传输数据,也是在开辟显存
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

}

VBO多属性数据

三角形有三个顶点,每个顶点也有数据,下面我们将这些数据传给OpenGL。

singleBuffer策略

void prepareSingleBuffer()
{
    // 1, 准备顶点位置数据与颜色数据
    float positions[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f, 0.5f, 0.0f
    };

    float colors[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f
    };



    // 2, 为位置和颜色数据各自生成一个VBO
    GLuint posVbo = 0, colorVbo = 0;

    glGenBuffers(1, &posVbo);
    glGenBuffers(1, &colorVbo);


    // 3, 给两个分开的VBO各自填充数据

    glBindBuffer(GL_ARRAY_BUFFER, posVbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
}

将位置和颜色存储到一起(InterleavedBuffer)


void prepareInterleavedBuffer()
{
    float vertices[] = {
    -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,  // 第一个顶点的位置和颜色,前三个数据为顶点数据,后三个为第一个顶点的颜色数据
    0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,  // 第二个顶点的位置和颜色
    0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f    // 第三个顶点的位置和颜色
    };

    GLuint vbo = 0;

    glGenBuffers(1, &vbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

}