簡體   English   中英

我應該使用相同的VBO傳遞不同的頂點屬性嗎? 還是我應該使用2?

[英]Should I use the same VBO for passing different vertex attributes? Or should I use 2?

我知道glVertexAttribPointer將使用VBO調用時綁定的值。 但是您可以在同一對象上緩沖兩次嗎? 它會取代里面的東西嗎? 還是可以清除緩沖區? 我不知道這種方法是否正確:

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);

最上面的示例將不起作用,因為第二個glBufferData調用將覆蓋第二個glBufferData中的所有緩沖區空間。 為了正確地做到這一點,您必須正確使用stride和pointer參數,以便對數據進行交織。 擁有多個VBO(每個存儲單獨的數據集)會更容易(也更干凈imo)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM