addVertex、addNormal .. addX、flush()、およびrender()関数で構成されるOOPでVBOのラッパーを作成しようとしています。最初は、次のような個別のベクトルで頂点、法線、インデックスを保持しています。
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);
この問題があります。オブジェクトに色、法線、またはテクスチャ座標が含まれておらず、頂点のみで構成されている場合はどうなりますか? それとも頂点と法線だけですか?または、常に頂点を持つデータのさまざまな組み合わせですか? 効率のために V(N)(T)(C) の順序で動的にパックできますか?