OpenGl glBegin durch glDrawArrays ersetzen



  • Hallo!

    Ich habe folgenden funktionierenden Code:

    glBegin(it->glDrawMode());
    for(QVector<float>::const_iterator p=buffer->constBegin(); p!=buffer->constEnd();)
    {
        float x = *p++;
        float y= *p++;
        glVertex2f(x,y);
    }
    glEnd();
    

    buffer ist also ein QVector<float> mit 2D Koordinaten von Linien / Punken ( glDrawMode ist entwedet GL_POINTS oder GL_LINES).
    Ich möchte nun das glBegin durch ein glDrawArrays ersetzen, aber mit folgendem Code bekomme ich bei glDrawArrays eine Access Violation bei 0x0000000

    // Buffer zeichnen
    glEnableClientState(GL_VERTEX_ARRAY);
    const float* data = buffer->data();
    int numVert = buffer->size() / 2; // Nur 2D Koordinaten
    glVertexPointer(2, GL_FLOAT, 0, &data[0]);
    glDrawArrays(it->glDrawMode(), 0, numVert);
    glDisableClientState(GL_VERTEX_ARRAY);
    

    Ich habe bereits versucht alle ClientState zu deaktivieren (bis auf GL_VERTEX_ARRAY). Was mache ich hier falsch?



  • vielleicht vereinfacht das hier mein problem:
    beim aufruf von diesem code her, bekomme ich eine access violation bei 0x00000000; normales zeichnet mit glBegin() ... glEnd() funktioniert

    std::vector< float > verts;
    verts.push_back( 0 );
    verts.push_back( 0 );
    verts.push_back( 0 );
    verts.push_back( 10 );
    verts.push_back( 0 );
    verts.push_back( 0 );
    verts.push_back( 10 );
    verts.push_back( 10 );
    verts.push_back( 0 );
    
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, &verts[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    


  • Habs jetzt gelöst indem ich VBOs benütze (glGenBuffers(...), glBindBuffer(...), etc.)


  • Mod

    vielleicht ist es ein driver bug.
    eventuell mal auf einer anderen machine testen und den bug dann beim GPU hersteller melden mit repro case, die freuen sich sicherlich ueber repro cases.



  • danke; könnte es vielleicht auch sein, dass die funktion glEnableClientState depracted sind und ich die irgendwie seperat aktivieren muss?


Anmelden zum Antworten