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

Aktuelle Zeit: Do Mär 28, 2024 17:58

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 11:58 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Guten Morgen/Mittag,
ich habe mich in letzter Zeit damit befasst, wie man die Vertices am günstigsten an die GPU weiter reicht.
Da ich momentan an einer "Engine" bastle, sprich eine ansammlung von Klassen die jedes mal wenn ich was lerne, erweiter werden,
habe ich mir die Frage gestellt, wie man das ganze am besten schön abstrakt machen könnte.

Dabei habe ich folgendes überlegt:
Es gibt ein Klasse VertexStream, dieser enthält die Vertex und eventuell auch Farb- und sonstige Informationen.
Eine Klasse Primitive, diese bekommt einen VertexStream zugeordnet und weiß wie mit den Daten umzugehen ist, also wie gezeichnet werden soll. ( sprich mit Indices oder welche Modus ( Linie, Dreiecke, o.Ä)
Dann die Mesh Klasse besteht aus mehrern Primitiven, die dann zusammen eben diese Mesh bilden.

Meine Frage nun: Ich kann in VertexStream ja super das ganze mit glInterleavedArrays machen, dann habe ich aber z.B. das Problem, dass ich nicht alle Kombinationen irgendwie darstellen kann, z.B. kann man nicht Farbe mit 4f und die Vertex mit 3f übergeben. Allerdings in allen anderen Fällen geht nur 4f.
Darum meine Frage, ist es vielleicht sinnvoller alle Eigenschaften einzellt zu übergeben, also mit glVertexPointer usw.

Oder ist sogar komplett von den Arrays abzuraten und ich solle direkt VBO's nehmen. Da hab ich aber auch eine Frage zu, und zwar, habe ich es richtig verstanden, die Arrays verweilen im normalen RAM und werden somit jedes mal wenn ich z.B. glInterleavedArrays aufrufe neu übertragen. Dagegen wenn ich einen Buffer anlege und diesen fülle, werden die Daten direkt in den VideoRAM geschrieben und bleiben da auch, wodurch ich natürlich einen erheblichen Performancegewinn hätte... Doch der VRAM ist ja relativ begrenzt.

Ich denke man muss wahrscheinlich ein Mittelmaß dafür finden, was in den VRAM und was normal übertragen werden soll finden oder?

Freundliche Grüße Desmu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also erstmal, gl*Pointer ist State-Of-The-Art und solltest du verwenden.

Den Unterschied zwischen Array und VBO hast du korrekt verstanden, ansonsten ist das Format gleich. Die Arraydaten werden allerdings beim Aufruf von glDraw* übertragen, nicht bei glInterleavedArray.

Bedenke auch, dass aktuelle Grafikkarten üblicherweise mehr als 500MB VRAM haben. Reine Geometrie (V3F; ohne optimierungen) passen da 14 Millionen Dreiecke rein. Üblicherweise braucht man weniger, weil man z.B. gleiche Vertices einfach zusammenlegt und durch Indexpuffer referenziert. Natürlich geht auch noch einiges an Platz für Texturen drauf und so, das wird v.a. der großteil sein.

Also um VRAM für Vertexdaten würde ich mir erstmal nicht so viele sorgen machen, wenn du keine riesigen (≥ 1Mio Vertices) Meshes renderst. Pass aber mit deiner Klassenstruktur auf: Wenn du für jede Primitivie ne eigene Instanz hast, wird das recht bald recht teuer werden, vom VRAM her. Auch sind Aufrufe an glDraw* das teuerste, du solltest also versuchen, so viele Primitivien wie möglich auf einmal zu rendern. Dafür gruppiert man üblicherweise nach Transformationsmatrix und Material und legt für jede dieser Gruppen einen Indexbuffer an. Also man gruppiert die Vertices in VBOs, eines für jedes Material und dann legt man für jede Transformation einen Indexpuffer(ausschnitt) an, den man dann in einem Drawcall zeichnen kann :).

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: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 12:47 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Hey cool, danke für die Antwort.

Also Ziel ist es also so viel wie möglich mit einem Aufruf zu zeichnen.
glDrawArrays bzw. glDrawElements erlaubt es mir ja direkt eine ganze Anzahl von Dreiecken zu zeichnen. Ich glaube ich habe den Begriff von Primitive irgendwie falsch verstanden. Was ich meinte war eben eine Reihe von Vertices die die selben Eigenschaften, z.B. Material besitzen. Aber mit den oben genannten Befehlen kann ich ja immer nur "eine" sache gleichzeitig zeichnen. z.B. nur den linken Arm, wenn jetzt beide die gleiche Texture verwenden würden. Das müsste dann also mit glMultiDrawArrays bzw. glMultiDrawElements gehen.

Aha, also speichere ich jeden Vertex genau einmal. Wenn ich jetzt einen Würfel mit 6 verschiedenen Seitenfarben habe, dann hätte man es ja als Anfänger so gemacht für jede Seite jeweils 4 Vertex zu zeichnen, jeweils mit entsprechender Farbe. Jetzt mache ich es so, dass ich nur 8 Vertex speichere, dafür dann aber jeweils für jede seite einen eigenes Farbarray zusammen setze. Schließlich rufe ich dann alles via glDrawElements und einem Indexarray auf, sodass immer entsprechend die Dreiecke mit den passenden Farben gezeichnet werden. Stimmts?

Noch eine Frage: Ich habe ja in dem Indexarray, praktisch die Nummer der Vertex in dem Vertexarray, welche genutzt werden soll. Wird dann aus dem Farbarray die Nummer aus dem Indexarray oder der Index der Indexarrays genommen?

Also so:
Code:
  1. for(int i = 0; i < count; i++) {
  2.   glColor(i); // oder wird hier auch der Index aus der Liste genommen, also glColor(list[i])
  3.   glVertex(list[i]);
  4. }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du kannst natürlich nur Vertices mit gleichen Eigenschaften zusammensetzen. Im Beispiel des Würfels musst du für jede Fläche vier Vertices anlegen. Aber eben nur vier, auch wenn du die Fläche als zwei Dreiecke zeichnest.

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: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 14:58 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Also wenn ich z.B. einen Zylinder habe, diesen mit einer Textur auf der Mantelfläche versehen will, werde ich somit nicht drumrum kommen, die beiden Anfangs- und Endvertex doppelt zu speichern? Einmal mit (u,v) = (0, 0) bzw. (0, 1) und einmal mit (1, 0) und (1, 1)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verständnisfrage zu VBO
BeitragVerfasst: Sa Feb 09, 2013 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, das ist korrekt. An den stellen, wo du das UV-Mesh auftrennst, musst du auch vertices doppelt speichern.

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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.073s | 18 Queries | GZIP : On ]