[OpenGL] Indices?



  • Bei Google finde ich leider kaum was, eigentlih so gut wie garnichts. Und bei dem Link steht da auch nur ganz kurz was dazu! mal eine Frage, wenn ich nun ein Spiel machen würde, mit dem zeichen verfahren wie aus OpenGL 1.0, wobei ich schön beim zeichnen die vertives einzelnd setze, bekomme ich damit ein schöne grafisches Spiel zuammen, mit einer guten Frame rate? Und um wie viel it es langsammer als wenn ich VertexBuffer und Indices verwende ...



  • Funktional kannst Du natürlich mit dem direkten Rendern von Vertexen alles machen, aber performancemäßig ist das eher Müll. Display-Lists und VBOs können Dein Programm, je nach Anzahl der Vertexe, durchaus einige Dutzend oder gar Hunderte mal schneller machen.

    Toturials, in denen explizit auf die Verwendung von VBos im Index-Modus eingegangen wird, habe ich zwar auch keins gefunden, aber wenn Du weißt, wie man Vertex-Arrays benutzt und wie man VBOs grundlegend (ohne Indizes) einsetzt, kannst Du auch VBOs mit Indizes einsetzen, da die Verwendung ja fast identisch ist.

    Les Dich also ein wenig ein, wenn Du die Mechanismen verstehst, dann kannst Du auch verstehen, warum etwas funktioniert bzw. nicht funktioniert. Wenn Du einfach nur Code aus einem Tutorial kopierst und etwas nicht klappt, stehst Du ja auch blöd da.



  • Bei NeHe gibts aber ein VBO-Tutorial , aber ohne VBO Indices, ich habe da mal ein Tutorial für dich gefunden: http://www.songho.ca/opengl/gl_vertexarray.html



  • Danke, das Tutorial ist sehr gut!



  • Das Tutorial war super, leider will es bei mir noch nicht so richtig funktionieren. Bei mir tritt ein Grafikfehler auf den ich mir nicht wirklich erklären kann:

    Ich habe zwei Quadrate:

    . ______ ______
    |0........1|..........2|
    |............|............|
    |______|______|
    3........4...........5

    Die Zhlen sind die Vertices, ich habe insgesammt 6 verices:

    GLfloat vertices[] = 
    {
    	-1,1,0,  1,1,0,  3,1,0,
    	-1,-1,0, 1,-1,0, 3,-1,0
    };
    

    Nun möchte ich die vertices so zu sagen Ordnen, dass daraus 2 Quadrate werden:

    GLubyte indices[] = 
    {
    	0,1,3,4,
    	1,2,4,5
    };
    

    Und schließlich zeichne ich das ganze:

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glDrawElements(GL_QUADS, 8, GL_UNSIGNED_BYTE, indices);
    glDisableClientState(GL_VERTEX_ARRAY);
    

    Als zweiten parameter für glDrawElements habe ich 8 angegeben, da ich ja 8 indices habe!

    nunja, jetzt kommt bei mir aber sowas raus:
    http://imageupload.com/out.php/i148763_b.JPG
    Ich kann mir das leider nicht erklären weil ich die Positionen oe das Quadrat verkrümmt garnnicht gesetzt habe! Wenn ich nur einen Vertex Array zechne Funtioniert es!



  • Kuck Dir mal die Reihenfolge der Indizes an, du gehst vom rechten oberen Eck ins linke untere Eck, stattdessen müsstest Du aber ins rechte untere Eck! Vertausche also jeweils die letzten beiden Indizes, dann sollte es klappen:

    GLubyte indices[] = 
    {
    	0,1,4,3,
    	1,2,5,4
    };
    


  • Danke, könntest du mr erklären warum man das so machen muss?



  • Ganz einfach, Du musst die Ecken in der Reihenfolge angeben, in der sie durch Linien verbunden werden. Zeichne das ganze Mal auf einem Blatt Papier auf, dann wirst Du sehen, warum Deine erste Reihenfolge falsch war.

    Ach ja, Du zeichnest im Uhrzeigersinn. OpenGL definiert aber standardmäßig die Vorderseiten im Gegenuhrzeigersinn, also entweder solltest Du Deine Zeichenreihenfolge umkehren oder die Seiteneinstellung mit

    glFrontFace(GL_CW)
    

    ändern.



  • OK, Danke! Ich hatte bsher nur mit Dreiecken gearbitet und da konnte man sie ja verbinden wie man will! Mal ne frage, ist es schneller wenn ich ein Trrain aus Quads mache, oder aus triangles?



  • Dreiecke sind eben immer konvex, Vierecke nicht! Aber auch bei Dreiecken solltest Du die Reihenfolge beachten, spätestens bei Lichteffekten wirst Du sonst Probleme kriegen.

    Und prinzipiell sind Dreiecke zwar schneller gerendert, aber wenn Du für jedes Viereck genau zwei Dreiecke brauchst, könnte es durchaus sein, dass es mit den Vierecken schneller geht. Es hängt sicherlich auch von der verwendeten Hardware und der OpenGL-Implementierung und dem Grafiktreiber ab, also probier es am besten aus!


Anmelden zum Antworten