現代3D圖形編程學習系列翻譯地址html
http://www.cnblogs.com/grass-and-moon/category/920962.html編程
在設置顏色一章中,咱們使用了一個緩存對象來存儲點和顏色的信息。那麼咱們有沒有可能,將點和顏色的信息分開存儲呢?這在實際應用中也許能夠使得各個屬性之間保持相互的獨立。本章補充內容須要作的事情就是這個。緩存
頂點屬性和顏色分別獨立存儲:學習
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 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(); }