簡體   English   中英

動態打包OpenGL頂點緩沖區對象的數據

[英]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.

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