0
我知道glVertexAttribPointer
將使用調用VBO時綁定的值。但是你能緩衝兩次到同一個對象上嗎?它會替代什麼?或者你可以清除一個緩衝區?我不知道這種方法是否正確:我應該使用相同的VBO來傳遞不同的頂點屬性嗎?或者我應該使用2?
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO); // shared VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);
glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_VERTEX, 0);
glBindVertexArray(0);
或者如果我應該使用2個VBO緩衝數據。如果您將glBufferData
函數調用兩次給同一個綁定的頂點數組對象,會發生什麼?這是其他方式,我會想到這樣做:
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO1); // VBO for vertices
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, VBO2); // VBO for colours
glBufferData(GL_ARRAY_BUFFER, sizeof(colours), colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
感謝您的回答。我知道你的意思,但我想我們是否可以使用多個維也納組織。那麼每個VAO只有1個VBO嗎?我也聽說我也可以使用'glBufferSubData'。事情是我想保持頂點attirbutes在sepparate C++數組中並單獨緩衝它們。所以我想我需要使用'glBufferSubData'? –
針對VAO的多個VBO是我的建議(也許我的回答沒有說清楚,我會更新它),這就是你在第二個例子中所做的。 'glBufferSubData'用於更新VBO的一部分,對於更新現有VBO非常有用,但通常不用於初始化它(除非數據非常大,並且您可能想要遞增發送) –
ok我明白了: D謝謝。那麼第二個例子呢?我看到其他人的方法,我認爲它也會起作用。我在這個文件中看到它https://github.com/BennyQBD/ModernOpenGLTutorial/blob/master/mesh.cpp –