[opengl] vertex arrays vs immediate mode



  • Hallo,

    für einen Geschwindigkeitsvergleich will ich vertex arrays, den immediate mode und display lists miteinanander vergleichen. Dazu habe ich zuerst ein 100x100 großes Gitter erstellt und gebe das immer aus.

    Bei ersten Tests schneiden die vertex arrays erbärmlich ab, und ich frage mich, wieso das so ist.

    immediate mode: 490 frames / sec
    display lists: 980 frames / sec
    vertex array: 20 frames / sec (hier mit index buffer)

    wie kann das sein?

    hier der code:

    glEnableClientState(GL_NORMAL_ARRAY);
         glEnableClientState(GL_VERTEX_ARRAY);
         glNormalPointer(GL_FLOAT, 0, &norms[0]);
         glVertexPointer(3, GL_FLOAT, 0, &verts[0]);
    
         glPushMatrix();
         glDrawElements(GL_QUADS, idxs.size(), GL_UNSIGNED_INT, &idxs[0]);
         glPopMatrix();
    
         glDisableClientState(GL_VERTEX_ARRAY);
         glDisableClientState(GL_NORMAL_ARRAY);
    


  • Darf ich fragen, wie du es im immediate mode genau renderst?



  • @GLSL mit glBegin und glEnd - klassisch nenne ich es einfach.

    ok, ungelogen, keine 5 Minuten nach diesem Post habe ich gemerkt, dass ich bei jedem Render-Aufruf die Vertex Arrays neu befüllt habe - das ist mir vorher natürlich nie aufgefallen... also hat sich das thema erstmal erledigt. danke euch! sorry!



  • Dann ist der Performanceeinbruch zu erklären!

    Wie viel FPS schaffst du denn nun per VertexArray (rein aus interesse ^^)



  • Mich würd interessieren wieviel FPS du mit VBOs schaffst 😉



  • also mit vertex arrays schaffe ich jetzt 740 frames / sec.

    vbos gehören eigentlich auch zum test, ich wollte erst die einfachen sachen klären, bevor ich hier was über vbos poste... sobald es hier was neues gibt, schreib ich das zum spaß mal rein hier.. und vielleicht kann man dann noch gemeinsam kritikpunkte des test besprechen 😃



  • Die VBO's werden sich wohl knapp unter der Displaylist einordnen 😉



  • Wie zeichnet man eigentlich in neueren OpenGL versionen Vertices? Wennn ich das richtig verstanden habe, sind ja glDrawArrays/Elements/was auch immer deprecrated?



  • Also beim neuen OpenGL gibt es diese Befehle nach wie vor in Kombination mit VBO's. Die Sache ist nur die, dass es dort keine Matritzen mehr gibt wie die ModelviewMatrix, ProjectionMatrix usw.
    Daher muss man das letztendlich mit einem Shader lösen.

    Heißt also: VBO + Shader zum darstellen von Objekten.



  • pyhax schrieb:

    glDrawArrays/Elements/was auch immer deprecrated?

    Nein, was deprecated ist, sind begin/end etc.
    Alles was hier steht kannst du problemlos verwenden. (Also solange der Grafiktreiber das schon kann, aber die meisten (alle?) Dinge sollten kein Problem sein.)
    http://www.opengl.org/sdk/docs/man4/


Anmelden zum Antworten