1

私が抱えている問題は、レベル内のメインジオメトリのVBOを作成した後、オブジェクトの2番目のジオメトリを作成すると、オブジェクトのVBOが機能しないことです。バッファが正しくバインドされていないと思いますが、一生それを見つけることができません。最初にレベルVBOを作成し、次にオブジェクトVBOを作成します。また、レベルVBOの作成を無効にすると、オブジェクトVBOが正しく作成されます。

これが私のコードです。

level.hで:

// Zone VBO
GLuint zoneVBO;
GLuint zoneVAO;
GLuint zoneIBO;

// Object VBO
GLuint objVBO;
GLuint objVAO;
GLuint objIBO;

ゾーン(ジオメトリ)VBOの作成-メモとして、作成は両方のVBOで正しく機能するため、データの移動は問題ではなく、バインディングエラーだと思います。

void WLD::createZoneVBO()
{
    // Get the size for our VBO
    int numVert = 0;
    int numPoly = 0;
    int VBOsize = 0;
    int IBOsize = 0;

    // Get the count of vertices and polygons
    for(int i = 0; i < zoneFragMap[0x36]; i++)
    {
        numVert += zmeshes[i].numVert;
        numPoly += zmeshes[i].numPoly;
        VBOsize += zmeshes[i].numVert * sizeof(Vertex);
        IBOsize += zmeshes[i].numPoly * 3 * sizeof(GLuint);
    }

    // Create the IBO and VBO data
    GLuint* iboData = new GLuint[zonePolyProcessed * 3];
    Vertex* vboData = new Vertex[zoneVertProcessed];

    int iboPos = 0;
    int vboPos = 0;

    // Create the VBO and IBO
    for(int i = 0; i < zoneFragMap[0x36]; i++)
    {
        // Copy the data to the IBO
        memcpy(&iboData[iboPos], zmeshes[i].indices, zmeshes[i].numPoly * 3 * sizeof(GLuint));//sizeof(*zmeshes[i].indices));

        // Advance the position
        iboPos += zmeshes[i].numPoly * 3;

        // Copy the data to the VBO
        memcpy(&vboData[vboPos], zmeshes[i].vertices, zmeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));

        // Advance the position
        vboPos += zmeshes[i].numVert;
    }

    //Create VBO for the triangle
    glGenBuffers(1, &zoneVBO);
    glBindBuffer(GL_ARRAY_BUFFER, zoneVBO);
    glBufferData(GL_ARRAY_BUFFER, zoneVertProcessed * sizeof(Vertex), vboData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    //Create the IBO for the triangle
    //16 bit indices
    //We could have actually made one big IBO for both the quad and triangle.
    glGenBuffers(1, &zoneIBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, zoneIBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, zonePolyProcessed * 3 * sizeof(GLuint), iboData, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    // Create the VAO
    glGenVertexArraysAPPLE(1, &zoneVAO);
    glBindVertexArrayAPPLE(zoneVAO);
    glBindBuffer(GL_ARRAY_BUFFER, zoneVAO);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    glEnableVertexAttribArray(3);
    glVertexAttribPointer(opaque["position"], 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(opaque["normal"], 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 3));
    glVertexAttribPointer(opaque["texcoord"], 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 6));
    glVertexAttribPointer(opaque["color"], 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 8));
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArrayAPPLE(0);

    delete[] iboData;
    delete[] vboData;
}

そして、オブジェクト-繰り返しますが、オブジェクトジオメトリは完全にロードされますが、ゾーンジオメトリがまだロードされていない場合に限ります。

void WLD::createObjectVBO()
{
    // Get the size for our VBO
    int numVert = 0;
    int numPoly = 0;
    int VBOsize = 0;
    int IBOsize = 0;

    // Get the count of vertices and polygons
    for(int i = 0; i < objFragMap[0x36]; i++)
    {
        numVert += objMeshes[i].numVert;
        numPoly += objMeshes[i].numPoly;
        VBOsize += objMeshes[i].numVert * sizeof(Vertex);
        IBOsize += objMeshes[i].numPoly * 3 * sizeof(GLuint);
    }

    // Create the IBO and VBO data
    GLuint* iboData = new GLuint[objPolyProcessed * 3];
    Vertex* vboData = new Vertex[objVertProcessed];

    int iboPos = 0;
    int vboPos = 0;

    // Create the VBO and IBO
    for(int i = 0; i < objFragMap[0x36]; i++)
    {
        // Copy the data to the IBO
        memcpy(&iboData[iboPos], objMeshes[i].indices, objMeshes[i].numPoly * 3 * sizeof(GLuint));//sizeof(*zmeshes[i].indices));

        // Advance the position
        iboPos += objMeshes[i].numPoly * 3;

        // Copy the data to the VBO
        memcpy(&vboData[vboPos], objMeshes[i].vertices, objMeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));

        // Advance the position
        vboPos += objMeshes[i].numVert;
    }

    //Create VBO for the triangle
    glGenBuffers(1, &objVBO);
    glBindBuffer(GL_ARRAY_BUFFER, objVBO);
    glBufferData(GL_ARRAY_BUFFER, objVertProcessed * sizeof(Vertex), vboData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    //Create the IBO for the triangle
    //16 bit indices
    //We could have actually made one big IBO for both the quad and triangle.
    glGenBuffers(1, &objIBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, objIBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, objPolyProcessed * 3 * sizeof(GLuint), iboData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    // Create the VAO
    glGenVertexArraysAPPLE(1, &objVAO);
    glBindVertexArrayAPPLE(objVAO);
    glBindBuffer(GL_ARRAY_BUFFER, objVAO);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    glEnableVertexAttribArray(3);
    glVertexAttribPointer(opaque["position"], 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(opaque["normal"], 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 3));
    glVertexAttribPointer(opaque["texcoord"], 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 6));
    glVertexAttribPointer(opaque["color"], 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float) * 8));
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArrayAPPLE(0);
}

これら2つのVBOのレンダリング:

        opaque.Use();
        glBindVertexArrayAPPLE(getVAO(2));
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, zoneIBO);
        glBindBuffer(GL_ARRAY_BUFFER, zoneVBO);
        glUniformMatrix4fv(opaque("camera"), 1, GL_FALSE, glm::value_ptr(cameraMat));
        renderGeometry(&cameraMat, 0, curRegion);
        glBindVertexArrayAPPLE(0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glBindVertexArrayAPPLE(objVAO);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, objIBO);
        glBindBuffer(GL_ARRAY_BUFFER, objVBO);
        glUniformMatrix4fv(opaque("camera"), 1, GL_FALSE, glm::value_ptr(cameraMat));
        renderObjects(&cameraMat);
        glBindVertexArrayAPPLE(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        opaque.UnUse();

要約すると、これはVBOの作成における問題だと思います。私は何か間違ったことをしていて、バインドされるべきときに何かをバインドし続けていると思います。

4

1 に答える 1

2
// Create the VAO
glGenVertexArraysAPPLE(1, &zoneVAO);
glBindVertexArrayAPPLE(zoneVAO);
glBindBuffer(GL_ARRAY_BUFFER, zoneVAO);  //<-------
glEnableVertexAttribArray(0);

zoneVBO私がハイライトした行では、これはではなくであるように見えますzoneVAO

glGetError でエラーをチェックする必要があります。この間違いが見つかった可能性があります。

また、renderObjects を呼び出す前にバッファーをバインドする必要はありません。頂点ポインターが VAO に格納されている場合、頂点ポインターは既に正しい場所を指しているため、バッファーをバインドする必要はありません。

于 2012-08-18T01:18:45.320 に答える