天天看點

小白學opengl 第五課 之 頂點數組對象頂點數組對象(Vertex Array Object, VAO)繪制

本文參考 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

小白學opengl 第五課 之 頂點數組對象頂點數組對象(Vertex Array Object, VAO)繪制

繼續閱讀