现代3D图形编程学习--opengl使用不一样的缓存对象(译者添加)

现代3D图形编程学习系列翻译地址html

http://www.cnblogs.com/grass-and-moon/category/920962.html编程

opengl使用不一样的缓存对象

设置颜色一章中,咱们使用了一个缓存对象来存储点和颜色的信息。那么咱们有没有可能,将点和颜色的信息分开存储呢?这在实际应用中也许能够使得各个属性之间保持相互的独立。本章补充内容须要作的事情就是这个。缓存

相对于上一章须要改变的内容有

顶点属性和颜色分别独立存储:学习

const float vertex[] = {
    0.0f, 0.5f, 0.0f, 1.0f,
    0.5f, -0.366f, 0.0f, 1.0f,
    -0.5f, -0.366f, 0.0f, 1.0f,
};

const float color[] = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f
};

Vertex Array Object

上一章中,绘制图像所需的数据都存储在Vertex Buffer Object中,而后利用glVertexAttribPointer来告诉opengl该缓存对象中的哪一个数据段是顶点位置属性,哪些数据段是颜色属性。若是想要将多个属性分别存储于独立的VBO中,那么此处就须要VAO出立刻任了。VAO可以用来存储多个VBO对象的对象。它被设计用来存储用于完成对象渲染所须要的信息:这里包括,数据,数据格式,以及不一样的数据对应的着色器中的location。翻译

因而将上一章中的InitializeVertexBuffer改为InitializeVAO设计

void InitializeVAO()
{
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &positionBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL__ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glGenBuffers(1, &colorBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, colorBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

同时display中的代码也须要进行以下的修改:code

void display()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    program.UseProgram();

    glBindVertexArray(vao);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL___TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

    glUseProgram(0);
    glutSwapBuffers();
}
相关文章
相关标签/搜索