本文參考 https://www.jianshu.com/p/dfe29d697a62
頂點數組對象(Vertex Array Object, VAO)
頂點數組對象(Vertex Array Object, VAO)可以像頂點緩沖對象一樣綁定,任何随後的頂點屬性調用都會儲存在這個VAO中。這有一個好處,當配置頂點屬性指針時,你隻用做一次,每次繪制一個物體的時候,我們綁定相應VAO就行了。切換不同頂點資料和屬性配置就像綁定一個不同的VAO一樣簡單。所有狀态我們都放到了VAO裡。
OpenGL核心模式版要求我們使用VAO,這樣它就能知道對我們的頂點輸入做些什麼。如果我們綁定VAO失敗,OpenGL會拒絕繪制任何東西。
聲明
//頂點緩沖對象
GLuint VAO;
生成頂點數組對象
//1 使用glGenBuffers函數生成一個緩沖ID
glGenVertexArrays(1, &VAO);
綁定
為了使用glBindVertexArray,我們繼承QOpenGLExtraFunctions而不是QOpenGLFunctions,QOpenGLExtraFunctions是QOpenGLFunctions的子類,QOpenGLExtraFunctions提供OpenGL ES 3.0、3.1和3.2 API的跨平台通路
//2 綁定vao
glBindVertexArray(VAO);
綁定類型
//3 使用glBindBuffer函數把新建立的緩沖綁定到GL_ARRAY_BUFFER緩沖類型上
glBindBuffer(GL_ARRAY_BUFFER, VAO);
構造頂點
複制資料
//4 把使用者定的義資料複制到目前綁定緩沖的函數
glBufferData(GL_ARRAY_BUFFER, sizeof(vc), vc, GL_STATIC_DRAW);
連結屬性
//5 連結頂點屬性
//indx: 屬性名
//size: 頂點大小
//type: 資料類型
//normalized:資料被标準化
//stride: 步長
//ptr: 資料在緩沖中起始位置的偏移量
glVertexAttribPointer(m_posAttr, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLvoid*)0);
glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (GLvoid*)sizeof(QVector3D));
解綁VAO
//6 解綁VAO
glBindVertexArray(0);
繪制
綁定vao
//1 綁定vao
glBindVertexArray(VAO);
開啟屬性
//2 開啟頂點屬性
glEnableVertexAttribArray(0);
//顔色值
glEnableVertexAttribArray(1);
繪制四邊形
//3 繪制四邊形
glDrawArrays(GL_QUADS, 0, 24);
停用屬性
//4 停用對應的頂點屬性數組
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
解綁VAO
//5 解綁VAO
glBindVertexArray(0);
源代碼
https://gitee.com/chen227/opengl_OpenGLFunctions4