6

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) の順序で動的にパックできますか?

4

1 に答える 1

1

Now there is this problem, what if my object doesn't contain colors, normals, or tex coords and only consists of vertices ? Or only about vertices and normals ?

Then you are going to set the offset to components you got with glVertexAttribPointer, and not set of components you are not using.

BTW you have a nice tutorial on opengl.org about VBOs.

于 2013-10-16T06:23:50.910 に答える