現代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();
}
相關文章
相關標籤/搜索