Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Apr 24, 2024 10:25

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Frage zu glInterleavedArrays
BeitragVerfasst: Mi Jul 10, 2013 20:35 
Offline
DGL Member

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?

gruß
Bio


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Do Jul 11, 2013 00:49 
Offline
DGL Member
Benutzeravatar

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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Do Jul 11, 2013 08:53 
Offline
DGL Member
Benutzeravatar

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).

Das ganze läuft so:
  1. Auswahl der Quellen für die Vertexdaten (z.B. mit glInterleavedArrays oder halt manuell über glVertexPointer, glNormalPointer, …)
  2. 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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Mo Jul 15, 2013 22:06 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Mo Jul 15, 2013 22:21 
Offline
DGL Member

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:
Code:
  1.  
  2.   glBindBuffer(GL_ARRAY_BUFFER, Vbo);
  3.   glEnableClientState(GL_VERTEX_ARRAY);
  4.   glBufferData(GL_ARRAY_BUFFER, Length(arVertex) * SizeOf(TVertex), @arVertex[0], GL_STATIC_DRAW);
  5.  


...und folgenden code zum Zeichnen...
Code:
  1.  
  2.   // fpc = Anzahl Punkte in einem Face-Eintrag
  3.  
  4.   glBindBuffer(GL_ARRAY_BUFFER, Vbo);
  5.   glInterleavedArrays(GL_N3F_V3F, SizeOf(TVertex), nil);
  6.   case fpc of
  7.     3 : glDrawArrays(GL_TRIANGLES,0,length(arVertex));
  8.     4 : glDrawArrays(GL_QUADS, 0, length(arVertex));
  9.   end;
  10.  


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:
Code:
  1.  
  2.   // Der alte Vertex-Buffer...
  3.   glBindBuffer(GL_ARRAY_BUFFER, Vbo);
  4.   glEnableClientState(GL_VERTEX_ARRAY);
  5.   glBufferData(GL_ARRAY_BUFFER, Length(arVertex) * SizeOf(TVertex), @arVertex[0], GL_STATIC_DRAW);
  6.  
  7.   // ...und der neue Index-Buffer
  8.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
  9.   glBufferData(GL_ELEMENT_ARRAY_BUFFER, Length(arFaces) div fpc, @arFaces[0], GL_STATIC_DRAW);
  10.  


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:
Code:
  1.  
  2.   glBindBuffer(GL_ARRAY_BUFFER, Vbo);
  3.   glInterleavedArrays(GL_N3F_V3F, SizeOf(TVertex), nil);
  4.  
  5.   // neuer Index-Buffer binden
  6.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Ibo);
  7.   // An dieser Stelle müsste ein Befehl kommen um OpenGL zu erklären wie meine Daten aufgebaut sind.
  8.   // Aber welcher wäre das?
  9.   // Ich habe ein Array of Integer dessen Länge bekannt ist, und ich weiss wieviel Punkte hintereinander zu einem Face  
  10.   // gehören.
  11.   ??? ... ???
  12.  
  13.   // und dann wird gezeichnet. Auch hier die Frage wie?
  14.   case fpc of
  15.     3 : glDrawArrays(GL_TRIANGLES,0,length(arVertex));
  16.     4 : glDrawArrays(GL_QUADS, 0, length(arVertex));
  17.   end;
  18.  


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.

Danke. :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Di Jul 16, 2013 07:35 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Irre ich mich, oder glDrawArrays geht nicht mit IBO, sondern ausschließlich glDrawElements?

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Di Jul 16, 2013 14:49 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Di Jul 16, 2013 20:17 
Offline
DGL Member

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Mi Jul 17, 2013 07:24 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Anscheinend sind alle QUADS-Befehle wirklich schon seit 3.0 deprecated, sollten wir im Wiki so kennzeichnen.

Zur Begründung ziehe ich jetzt einfach mal das heran:

http://stackoverflow.com/questions/6644 ... t-gl-quads

hoffe, dass man dieser Quelle halbwegs vertrauen kann, da das auch einige andere Quellen sagen ;)

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Do Jul 18, 2013 09:02 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu glInterleavedArrays
BeitragVerfasst: Do Jul 18, 2013 09:12 
Offline
DGL Member
Benutzeravatar

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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.206s | 19 Queries | GZIP : On ]