[英]Dynamically Packing Data for Vertex Buffer Objects of OpenGL
我試圖在OOP中為VBO編寫一個包裝器,它包含addVertex,addNormal .. addX,flush()和render()函數。 首先,我在不同的向量中保存頂點,法線,索引,如:
std::vector<glm::vec4> vertexBuffer;
std::vector<glm::vec4> colorBuffer;
std::vector<glm::vec3> normalBuffer;
std::vector<glm::vec2> texCoordBuffer;
std::vector<unsigned int> indexBuffer;
但是當我在某處讀到時,為每個人保存不同的VBO ID是完全沒有效率的,因此最好按照VertexNormalTexCoordColor - VNTC - VNTC ...的順序打包它們,並將它們表示在一個VBO ID中。 因此,上傳到GPU時可以有效地使用緩沖區。 所以這次我仍然將它們保存在向量中但是當我調用flush()時我想用結構包裝它們,然后將該結構向量上傳到GPU:
struct VBOData {
glm::vec4 vert;
glm::vec3 normal;
glm::vec4 color;
glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;
然后我上傳flush()中的所有內容:
vboBuffer.reserve(vertexBuffer.size());
for (int i = 0; i < vertexBuffer.size(); ++i) {
VBOData data;
data.vert = vertexBuffer[i];
data.color = colorBuffer[i];
data.normal = normalBuffer[i];
data.texcoord = texCoordBuffer[i];
vboBuffer.push_back(data);
}
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vboBuffer.size() * sizeof(VBOData), (GLchar*) &vboBuffer[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
現在有這個問題,如果我的對象不包含顏色,法線或tex坐標並且只包含頂點怎么辦? 或者只關於頂點和法線? 或者總是有頂點的不同數據組合? 為了提高效率,我能否以V(N)(T)(C)順序動態打包它們?
現在有這個問題,如果我的對象不包含顏色,法線或tex坐標並且只包含頂點怎么辦? 或者只關於頂點和法線?
然后,您將使用glVertexAttribPointer設置的組件的偏移量,而不是您未使用的組件集。
順便說一句,你在opengl.org上有一個關於VBO的很好的教程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.