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

Aktuelle Zeit: Di Apr 23, 2024 10:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VAOs und glDrawElements
BeitragVerfasst: So Mär 01, 2015 22:26 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Ich habe eine Frage zu glDrawElements.

Momentan generiere ich einen GL_ARRAY_BUFFER, dieser beinhaltet Position, Farbe und UV.
Ich nutze den Buffer also als Interleaved, in dem ich beim eigentlichen Zeichnen folgendes durchführe:

Code:
  1.  
  2. glBindBuffer(GL_ARRAY_BUFFER, _vboID);
  3. glEnableVertexAttribArray(0);
  4. glEnableVertexAttribArray(1);
  5. glEnableVertexAttribArray(2);
  6.  
  7. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
  8. glVertexAttribPointer(1, 4, GL_FLOAT, GL_TRUE, sizeof(Vertex), 12);
  9. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 20);
  10.  
  11. glDrawArrays(GL_TRIANGLES, 0, 6);
  12.  
  13. glDisableVertexAttribArray(0);
  14. glDisableVertexAttribArray(1);
  15. glDisableVertexAttribArray(2);
  16. glBindBuffer(GL_ARRAY_BUFFER, 0);
  17.  


Mit diesem Konstrukt kann ich ja wohl keine glDrawElements-Funktion nutzen, oder?
glDrawElements nutzt ja einen anderen Buffer (Typ und Grösse) als glDrawArrays.

Also nehme ich an, ich müsste das ganze wohl in einen VAO packen.
Beim erstellen denke ich so vorzugehen:
Code:
  1.  
  2. glGenVertexArrays(1, _vaoID);
  3. glGenBuffers(1, _vboData);
  4. glGenBuffers(1, _vboIndices);
  5.  
  6. glBindVertexArray(_vaoID);
  7.  
  8. glBindBuffers(_vboData);
  9. glBufferData(GL_ARRAY_BUFFER mit interleaved array (position, farbe, uv).....);
  10.  
  11. glBindBuffers(_vboIndices);
  12. glBufferData(GL_ELEMENT_ARRAY_BUFFER mit indices....);
  13.  
  14. glBindBuffer(0);
  15. glBindVertexArray(0);
  16.  


Beim Zeichnen bin ich mir dann nicht sicher wie ich vorgehen sollte.
Ich stelle mir folgendes vor:
Code:
  1.  
  2. glBindVertexArray(_vaoID);
  3.  
  4. glBindBuffer(_vboData);
  5. glEnableVertexAttribArray(0);
  6. glEnableVertexAttribArray(1);
  7. glEnableVertexAttribArray(2);
  8. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
  9. glVertexAttribPointer(1, 4, GL_FLOAT, GL_TRUE, sizeof(Vertex), 12);
  10. glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), 20);
  11.  
  12. glBindBuffer(_vboIndices);
  13. glDrawElements(GL_TRIANGLES, ....);
  14.  
  15. glBindBuffer(0);
  16. glBindVertexArray(0);
  17. glEnableVertexAttribArray(0);
  18.  


Wäre das so richtig?
Die Nummern der VertexAttribArrays stimmen doch mit den VertexAttribPointern überein?
Ich muss aber den Buffer gebunden haben, damit die AttribArrays greifen, oder?
Danach kann ich dann den zweiten Buffer binden, um damit die Elemente zu zeichenen.

Ich hoffe ich hab das jetzt richtig verstanden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAOs und glDrawElements
BeitragVerfasst: Mo Mär 02, 2015 00:48 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Das Tolle an einem VAO ist, dass es dir die Sachen, die du ihm mittels glVertexAttribPointer uebergibts im Grafikspeicher zwischenspeichert und dann automatisch beim Rendering nutzt.

Darum gehoert der ganze glVertexAttribPointer Foo in den Initteil und wird nur einmal aufgerufen.

Weiterhin ist darauf zu achten, dass du VBO und IBO nach erstmaligem Binden des VAO einmal bindest, damit das VAO jene mitspeichert, dann brauchst du nur noch das VAO zu binden und hast automatisch VBO und IBO mitgebunden und kannst sofort mit dem Rendering loslegen.

Fuer ein zweites VBO musst du afaik auch ein zweites VAO erstellen. Ich nutze im Prinzip ein grosses VBO mit moeglichst vielen Dingen drin und greife mit mehreren VAOs beim Rendering darauf zu. Dies erspart mir saemtliche VBO Statewechsel.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAOs und glDrawElements
BeitragVerfasst: Mo Mär 02, 2015 17:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Guck mal mein Code-Beispiel hier an, da sieht man es gut wie dies mit den VBO/VAOs geht.

viewtopic.php?f=10&t=11311

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VAOs und glDrawElements
BeitragVerfasst: Di Mär 03, 2015 21:33 
Offline
DGL Member

Registriert: Sa Apr 09, 2011 20:48
Beiträge: 43
Programmiersprache: Delphi
Vielen Dank für eure Beispiele.
Ich möchte euch nur kurz mitteilen, was ich getan habe.

(.......etliche Zeilen gelöschter Text........)

Ich wollte eigentlich genau beschreiben, wie ich mich durch die unzähligen Beispiele im Internet gekämpft habe und welche
Probleme mir dabei ins Auge gesprungen sind.
Nach dem ich den Text aber geschrieben habe, schien er mir viel zu negativ rüberzukommen. Deshalb habe ich
den Text wieder gelöscht, denn ich möchte hier nicht als undankbarer Rüpel rüberkommen.

Ich bin nämlich für jede Antwort, ob Sie mir direkt hilft oder nicht, dankbar.
Und das Topic ist nunmal nicht unbedingt geradewegs beantwortbar, wie ich im Laufe meiner Recherche
feststellen musste.

Dann hab ich mir selbst noch ein Bein gestellt, und die Indizes in einer falschen Reihenfolge zeichnen lassen. Lol.
Wäre das nicht genug, ist mir bei der Berechnung der Buffergröße auch noch ein Mißgeschick passiert.
Kurz gesagt: Ich habe mir aus ca. 8 Beispielen eine ganz eigene Routine zusammengebastelt, die jetzt auch läuft.

Ich bin jetzt soweit einigermaßen zu verstehen, wie das Ganze grundsätzlich funktioniert.
Allerdings ist OpenGl so was von flexibel, daß man um die nächste Ecke wieder einen mit der Steinaxt auf den Kopf bekommt.
Also werd ich den Kopf nicht so hoch tragen. :-)

Also Danke an euch und ich hoffe ich kann mich auch mal revangieren.

Jürgen


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 69 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.202s | 15 Queries | GZIP : On ]