c ++ - OpenGL - Flere glDrawArrays () opkald viser kun resultater fra først?

Indlæg af Hanne Mølgaard Plasc

Problem



Så jeg gentager gennem et par masker, hver lagret i sin egen GL\_ARRAY\_BUFFER, men begge deler den samme glVertexAttribPointer-struktur. Jeg gentager gennem hver render/draw pass i en for loop:


if (sConfig.mRendering.isRenderTypeActive(RENDER\_TYPE\_SINGLE\_MESH) || 
    sConfig.mRendering.isRenderTypeActive(RENDER\_TYPE\_TWO\_MESH)) {
    const int mesh\_count = sConfig.mRendering.isRenderTypeActive(RENDER\_TYPE\_TWO\_MESH) ? 2 : 1;
    for (int i = 0; i < mesh\_count; i++) {
        std::lock\_guard<std::mutex> lock(mModelDataMutex[i]);
        mUniV\_VertexTransform->setValue(mModelTransform[i]);
        glBindBuffer(GL\_ARRAY\_BUFFER, mVBOs[i]); CHECK\_GL\_ERR;
        glDrawArrays(GL\_TRIANGLES, 0, (GLsizei)mVertexCount[i]); CHECK\_GL\_ERR;
    }
}


Og indstil dataene for hver VBO ved hjælp af et par opkald til følgende funktion:


bool ::updateModelData(const RenderCloud& data, VERTEX\_BUFFER\_ID id /*= VBID\_MESH\_0*/)
{
    if (id < VBID\_COUNT)
    {
        std::lock\_guard<std::mutex> lock(mModelDataMutex[id]);
        // Bind Point VBO
        glBindBuffer(GL\_ARRAY\_BUFFER, mVBOs[id]); CHECK\_GL\_ERR\_RET;
        // Set coordinate attribute
        glVertexAttribPointer(BTID\_COORDS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)BT\_COORDS\_OFFSET); CHECK\_GL\_ERR\_RET;
        glEnableVertexAttribArray(BTID\_COORDS); CHECK\_GL\_ERR\_RET;

        // Set the normals attribute
        glVertexAttribPointer(BTID\_NORMALS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT\_NORMALS\_OFFSET)); CHECK\_GL\_ERR\_RET;
        glEnableVertexAttribArray(BTID\_NORMALS); CHECK\_GL\_ERR\_RET;

        // Set the colors attribute
        glVertexAttribPointer(BTID\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT\_COLOR\_OFFSET)); CHECK\_GL\_ERR\_RET;
        glEnableVertexAttribArray(BTID\_COLOR); CHECK\_GL\_ERR\_RET;
        // Copy Data
        glBufferData(GL\_ARRAY\_BUFFER, data.pts.size() * data.elemSize(), data.pts.data(), GL\_STATIC\_DRAW); CHECK\_GL\_ERR\_RET;
        mVertexCount[id] = data.pts.size();
        // Unbind buffer
        glBindBuffer(GL\_ARRAY\_BUFFER, 0); CHECK\_GL\_ERR\_RET;
        return true;
    }
    return false;
}


Jeg kan verificere, at dataene er der for begge VBO'er, men kun den første VBO i for-loop'en gengives ved hjælp af glDrawArrays ()


De deler skygge geometri shader, som derefter bruges af en udskudt rendering stak for at anvende effekter.


Har hver glDrawArrays () -opkald sin egen forekomst af geometrisk shader, så længe de alle deler de samme trækbuffere?

Bedste reference


Det er ikke det bundne vertex-bufferobjekt, der definerer en matrix af generiske vertexattributdata, men det er den tilstand, der er gemt i standard-vertex arrayobjektet.


Når du ringer til glVertexAttribPointer, er rækken af ​​generiske vertexattributdata defineret. Hvis der på dette tidspunkt er bundet en matrixbuffer, refererer array definitionen til bufferobjektet. [7]


Dette betyder at du skal skifte array definitionen, før du tegner objektet:


glBindBuffer(GL\_ARRAY\_BUFFER, mVBOs[id]);

glVertexAttribPointer(BTID\_COORDS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)BT\_COORDS\_OFFSET);
glEnableVertexAttribArray(BTID\_COORDS);

glVertexAttribPointer(BTID\_NORMALS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT\_NORMALS\_OFFSET));
glEnableVertexAttribArray(BTID\_NORMALS);

glVertexAttribPointer(BTID\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT\_COLOR\_OFFSET));
glEnableVertexAttribArray(BTID\_COLOR);

glDrawArrays(GL\_TRIANGLES, 0, (GLsizei)mVertexCount[i]);
glBindBuffer(GL\_ARRAY\_BUFFER, 0);


Men jeg anbefaler at bruge et Vertex Array Object. En vertex array-objekt lagrer tilstanden for den generiske vertex array definition: [8]


GLuint vao[VBID\_COUNT];

....

glGenVertexArrays( 1, vao[i] );
glBindVertexArray( vao[i] );

glBindBuffer(GL\_ARRAY\_BUFFER, mVBOs[id]);

glVertexAttribPointer(BTID\_COORDS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)BT\_COORDS\_OFFSET);
glEnableVertexAttribArray(BTID\_COORDS);

glVertexAttribPointer(BTID\_NORMALS, 3, GL\_FLOAT, GL\_FALSE, RenderCloud::elemSize(), (GLvoid*)(BT\_NORMALS\_OFFSET));
glEnableVertexAttribArray(BTID\_NORMALS);

glVertexAttribPointer(BTID\_COLOR, 4, GL\_UNSIGNED\_BYTE, GL\_TRUE, RenderCloud::elemSize(), (GLvoid*)(BT\_COLOR\_OFFSET));
glEnableVertexAttribArray(BTID\_COLOR);

glBufferData(GL\_ARRAY\_BUFFER, data.pts.size() * data.elemSize(), data.pts.data(), GL\_STATIC\_DRAW);
mVertexCount[id] = data.pts.size();

glBindBuffer(GL\_ARRAY\_BUFFER, 0);

glBindVertexArray( 0 );





glBindVertexArray( vao[i] );
glDrawArrays(GL\_TRIANGLES, 0, (GLsizei)mVertexCount[i]); 
glBindVertexArray( 0 );