Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Ich habe mir überlegt ob es nicht Sinn macht mit einem interleaved Array zu arbeiten. Auf diese Weise kann ich erst mal mit GL_N3F_V3F meinen Datenaufbau für OpenGL ohne Vertun erklären. Allerdings weiss ich beim Zeichnen vorher nicht ob es sich um Triangles oder Quads handelt, die gezeichnet werden müssen.
Gibt es daher eine Möglichkeit glDrawElements mit glInterleavedArrays einzusetzen?
Falls ja, dann müsste ich doch auch ein Index-Array übergeben, damit klar ist welche Vertices als Faces verbunden werden müssen. Geht das?
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Da ich immer noch mit Displaylists arbeite kann ich zum eigentlichen Problem nicht viel sagen.
Aber vielleicht macht es Sinn die Quads sowieso völlig zu vernachlässigen und sie schon beim Laden des Modells (oder was auch immer) schon in Triangles zu konvertieren. Macht sonst OpenGL sowieso intern. Deine Handhabung wäre nur wesentlich einfach.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Natürlich kannst du glDrawElements verwenden, du musst sogar, sonst kannst du garnicht zeichnen. glInterleavedArrays legt nur fest, in welchem Format die Verticies in deinem Buffer liegen. Welche Geometrie du daraus baust, sagst du erst mit einem Drawcall (z.B. glDrawArrays, wenn du erstmal keinen Indexbuffer verwenden möchtest).
Zeichnen der Verticies, entweder per Indexbuffer mit glDrawElements (dann muss dieser auch gebunden sein) oder direkt mit glDrawArrays
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
damadmax hat geschrieben:
Aber vielleicht macht es Sinn die Quads sowieso völlig zu vernachlässigen und sie schon beim Laden des Modells (oder was auch immer) schon in Triangles zu konvertieren.
Das geht für mich leider nicht so einfach, da ich WaveFront-Obj Dateien einlese und das meine Fähigkeiten momentan übersteigt, bzw. ich mich erst mal mit dem Einladen der vorhandenen Daten beschäftigen möchte.
Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Lord Horazont hat geschrieben:
Natürlich kannst du glDrawElements verwenden, du musst sogar, sonst kannst du garnicht zeichnen.
Egal was ich auch versucht habe, bei glDrawElements krachts. Ich bin da schon ziemlich dran verzweifelt und wollte alles hinschmeissen. Aber dann hab ich noch mal von Vorne angefangen.
Jetzt funktioniert die Darstellung soweit, das ich die Vertices einlesen kann und diese korrekt als GL_TRIANGLES oder GL_QUADS erscheinen. Allerdings eben noch nicht mit glDrawElements. Das möchte ich jetzt wieder hinzufügen. Weiss aber noch nicht wie. Bisher habe ich folgendes um die Buffer zu füllen:
Damit erscheinen die Objekte auf dem Bildschirm und man kann erkennen, das die Daten korrekt interpretiert werden. Allerdings fehlt mir jetzt zum guten Schluss noch der Index-Buffer.
Dazu lese ich die Faces ein und erstelle ein Array of Integer. Diesen Buffer füge ich zuerst beim laden des Objekts hinzu:
glBufferData(GL_ELEMENT_ARRAY_BUFFER, Length(arFaces) div fpc, @arFaces[0], GL_STATIC_DRAW);
Wäre das so richtig, oder mach ich hier schon einen Fehler? Wenn das korrekt ist, was muss ich in meiner Zeichenroutine verändern, damit ich die Indizes nutzen kann? Ich müsste meine Routine ja in etwa so ändern:
Ich hoffe das ist jetzt nicht zuviel der Fragerei, allerdings wird ein solches Beispiel mit Indizes im Wiki nicht erwähnt. Da geht es "nur" um Normals und Texturecoords, die ja einfach mit glInterleavedArrays abgehandelt werden. Das nutzt mir aber bei einem Index-Array nichts.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
end hat recht. Du musst, für einen Indexbuffer, glDrawElements verwenden. Da gibst du auch an, wie deine Daten formatiert sind (type-Argument). Ansonsten ist dein Code richtig. Es braucht kein zusätzliches glInterleavedArrays-Äquivalent für den Indexbuffer.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Apr 09, 2011 20:48 Beiträge: 43
Programmiersprache: Delphi
Lustig. Momentan funktioniert mein Code mit eben jenem glDrawArrays-Befehl. Sobald ich im alten Code versuchte glDrawElements zu verwenden kam die Exception. Aber ich versuch das jetzt mal mit dem hier gezeigten neuen Code.
Auf der OpenGL 4 Reference Webseite für glDrawElements http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml fehlen allerdings die Parameter GL_QUADS und GL_POLYGONS für den Mode, diese sind auf der von dir verwiesenen Wiki-Seite jedoch vorhanden.
Bedeutet das, das diese Befehle in der neuesten OpenGL Version deprecated sind?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2621 Wohnort: Berlin
Programmiersprache: Go, C/C++
Wieso sollte man auch Quads zum rendern anbieten ? Triangles erlaubt alle anderen Primitive, mit Ausnahme Points, zu rekonstruieren. Ein Vorteil war, dass man sich Daten sparen konnte aber mit Indices ist auch die Sache hinfällig und diese sind seit ner weile im Standard drin.
Egal wie deine Meshes konstruiert werden, mit Triangle und indices kann man fast alle Primitive abbilden.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
BionicWave hat geschrieben:
Das geht für mich leider nicht so einfach, da ich WaveFront-Obj Dateien einlese und das meine Fähigkeiten momentan übersteigt, bzw. ich mich erst mal mit dem Einladen der vorhandenen Daten beschäftigen möchte.
Wavefront lade ich auch. Wenn ein Face mit 3 Werten kommt, wird es ein Dreieck. Kommt ein Face mit 4 Werten, werden daraus 2 Dreiecke konstruiert. Vertices 0-1-3 und 1-2-3. Oder 0-1-2 und 0-2-3. Ist ja wurscht solange es gegen den Uhrzeigersinn geht, bei GL_CCW.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Mitglieder in diesem Forum: 0 Mitglieder und 54 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.