2

所以我在看another SO question regarding the command glVertexAttribPointer,我遇到了一些困惑。在接受這個問題的答案解釋,我可以有多個GL_ARRAY_BUFFER緩衝區嗎?

但有狀態的附加隱含一塊也存儲離開屬性0,當你撥打電話:將數據從當前綁定到GL_ARRAY_BUFFER

緩衝區中讀取

這對我有意義,但是如果我有多個緩衝區綁定爲GL_ARRAY_BUFFERglVertexAttribPointer()方法如何知道哪個設置屬性?

例如,在我的代碼中,我繪製了一個漸變三角形。爲此,我創建了2個VBO,一個是數組中的顏色數據,另一個是頂點位置。

glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    static const GLfloat points[] = { 
    //data here 
    }; 
    static const GLfloat colors[] = { 
     //data here 
    }; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    vs = glCreateShader(GL_VERTEX_SHADER); 
    fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(vs, 1, &vertexShaderData, NULL); 
    glShaderSource(fs, 1, &fragShaderData, NULL); 
    glCompileShader(vs); 
    glCompileShader(fs); 
    sp=glCreateProgram(); 
    glBindFragDataLocation(sp, 0, "outColor"); 
    glAttachShader(sp, vs); 
    glAttachShader(sp, fs); 
    glLinkProgram(sp); 
    glUseProgram(sp); 
    glGenBuffers(1, &colorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(1); 
    glDrawArrays(GL_TRIANGLES, 0, 9); 

當我調用命令時,我在哪裏指定要使用哪個緩衝區?

回答

4

這對我有意義,但如果我有多個緩衝區綁定爲GL_ARRAY_BUFFER會怎樣?

這是不可能的。當你將一個緩衝區(或任何OpenGL對象)綁定到一個目標時,它會自動解除之前所有的綁定。

OpenGL object targets就像全局變量。將全局整數設置爲3會發生什麼?它的舊價值已經消失。

glVertexAttribPointer總是使用任何緩衝區目前勢必GL_ARRAY_BUFFER。所以在你的第一個電話中,它將使用buffer。在你的第二個電話中,它將使用colorBuffer

這就是爲什麼重要的是要記住glVertexAttribPointer目前的有什麼作用。因爲即使綁定了colorBuffer並將其設置爲屬性1使用,屬性0 仍然buffer接收其頂點數據。

所以,雖然你不能有多個緩衝區綁定到GL_ARRAY_BUFFER,你可以可以使用多個緩衝區作爲你的頂點數據的來源。

相關問題