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

Aktuelle Zeit: Fr Mär 29, 2024 00:08

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: glVBO.pas
BeitragVerfasst: Mo Sep 22, 2008 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Buffer Objects bekommen eine immer größer werdende Rolle. Ganz besonders stehen dabei die Vertex Buffer Objects im Vordergrund. Nur sind die nicht nur äußerst praktisch, schnell und schmecken nach Vanille sondern sie sind auch nicht unbedingt für Einsteiger oder Schreibfaule (wie mich) gedacht. Besonders wenn man die Variante mit Pointern benutzt kann es gut und schnell mal passieren, dass man ein falsches Offset benutzt und Speicherzugriffsfehler riskiert etc. Oder wenn man mit konstanten Arrays arbeitet, dann erzeugen VBOs im Vergleich zum Imediate Mode durchaus etwas mehr Aufwand.

Das ist etwas was ich gerne ändern möchte. Dazu möchte ich ähnlich wie bei der glBitmap eine Klasse erstellen, die für verschiedene Aufgaben eingesetzt werden kann. Dabei soll der Schwerpunkt in erster Linie auf einfache Bedienbarkeit liegen. Allerdings nichts desto trotz möchte größtmöglichstes Maß an Flexibilität, Geschwindigkeit und Sicherheit bewahren. Allerdings ist es NICHT (ich wiederhole NICHT) Ziel einem Modelloader zu schreiben.

Ich hatte mehrfach darüber nachgedacht ob ich das Ganze als ein Communityprojekt aufziehen möchte oder nicht. Die Entscheidung ist letzten Endes dagegen gefallen, da ich nicht möchte, dass dieses Projekt das gleiche Schicksal ereilt wie den anderen Massenprojekten. Nichts destro tzotz bin ich, wie alle anderen Projekte auch, auf Feedback und Ideen angewiesen. Ich bin auf jeden Fall auch gewillt Codeschnipsel, Idee etc. mit in die Unit aufzunehmen. Der jenige wird dann selbstverständlich mit in der Unit verewigt. Allerdings behalte ich mir auch das Recht vor Schnipsel nicht mit aufzunehmen. Und zwar genau dann, wenn sie zu speziell auf einen einzigen Fall abzielen. Mehr oder weniger also doch eine Art Community Projekt aber ein moderiertes und bei dem trägt nur einer die Schuld falls es nicht klappt. ;)

Nun aber zu dem was ich mir bereits ausgedacht habe. Es gibt eine Klasse TglVBO die aktuell ein VBO Kappselt. Es ist aktuell leider auch die einzigste Klasse innerhalb der Unit. Alle anderen Buffer Objects werden aktuell noch vollständig außer acht gelassen. Der Schwerpunkt liegt aktuell auch nur darauf wie man sich am einfachsten Daten zusammenbauen kann. Dazu hat man die Möglichkeit mit dem Befehl AddVertexElement maßgeschneiderte Elemente zu einem Vertex hinzuzufügen. Dabei hat man auch verschiedenen ElementTypen (Vertex, Normal, Color, TexCoord, ...) die Auswahl. Außerdem stehen die gebräuchlichen Datentypen zu Verfügung. Und man hat die Möglichkeit Anzahl der Elemente und Dimensionen frei zu wählen. Die Anzahl gibt die Anzahl der Werte wieder. Das kennt man aus OpenGL zum Beispiel unter 2f, 3f oder 4ub. Dabei ist die Anzahl jeweils 2, 3 und 4 und der Datentyp wäre Float, Float und unsigned Byte. Die Dimension ist eine komplette Kopie der Datenwerte. Also eine Dimension von 2+ bei den TexturKoordinaten würde dafür sorgen, dass man mehrere Texturkoordinaten pro Vertex ablegen kann. Für jede benötigte Textur eine eigene.

Da es aber meistens auch hier immer wieder auf ein Schema hinauslaufen würde gibt es die Methode AddVertexElementDraft, bei der mal einen Wert aus einem Aufzählungstypen übergeben kann. Dort sind aktuell ein paar Werte definiert. Zum Beispiel. vertex_2f, vertex_3f, normal_3f, color_3ub, texture_coord_2f, usw.

Zum Hinzufügen der Daten muss man entweder einen Vertex hinzufügen oder eine Vertexanzahl setzen und einen Vertex öffnen. Anschließend kann man zum Beispiel mit der Methode Write3f 3 Floats auf einen Elementtypen und eine Dimension schreiben.

Einzige Einschränkung dabei ist die, dass jeder ElementTyp nur ein einziges Mal hinzugefügt werden kann. Also es ist nicht möglich 3x TexturKoordinaten mit 2f und 1x mit 3f oder aber 1f zu erstellen. Was je nach Anwenungsall etwas ungünstig sein könnte.

Außerdem erlaubt es die Klasse einen Index zu erstellen. Dabei hat man 3 Datentypen zur Auswahl. Es ist auch möglich die VertexDaten und die IndexDaten in 2 seperaten Klassen abzulegen und zu verwenden (ungetestet).

Als Code könnte das dann wie folgt aussehen.



Code:
  1.   vbo := TglVBO.Create;
  2.   vbo.AddVertexElementDraft(draft_vertex_3f);
  3.   vbo.AddVertexElementDraft(draft_texture_coord_2f);
  4.   vbo.AddVertexElementDraft(draft_color_3ub);
  5.   vbo.VertexCount := 8;
  6.  
  7.   vbo.OpenVertex(0);
  8.   vbo.Write3f(element_type_vertex, -2, 2, -2);
  9.   vbo.Write2f(element_type_texture_coord, 0, 0);
  10.   vbo.Write3ub(element_type_color, $00, $FF, $00);
  11.  
  12.   vbo.OpenVertex(1);
  13.   ...
  14.  
  15.   vbo.AddIndex(data_type_ubyte);
  16.   vbo.IndexCount := 24;
  17.  
  18.   // unten
  19.   vbo.WriteIndexUByte( 0, 0);
  20.   vbo.WriteIndexUByte( 1, 1);
  21.   ...
  22.  
  23.   vbo.GenerateBuffer;


Code:
  1. // Zeichnen
  2.   vbo.BindVertexBuffer;
  3.   vbo.ActivateElement(element_type_color);
  4.   vbo.ActivateElement(element_type_texture_coord);
  5.   vbo.ActivateElement(element_type_vertex);
  6.  
  7.   vbo.BindIndexBuffer;
  8.  
  9.   glDrawElements(GL_QUADS, vbo.IndexCount, GL_UNSIGNED_BYTE, Pointer(vbo.VertexDataSize));


Das Zeichnen und generieren des VBOs lässt in jedem Fall zu wünschen übrig. Es handelt sich bei allem aber eher um eine Umsetzung einer Idee. Also das Ganze befindet sich noch sehr sehr sehr weit am Anfang. Allerdings das was existiert läuft zu mindest Fehlerfrei und stabil.

Ideen die später noch folgen könnten.
- Mehrere Buffer Klassen teilen sich einen Speicherbereich
- Das Ganze viel dynamischer gestalten. Streaming von Vertexdaten etc.
- Flexibler beim erstellen
- Unterstützung anderer Buffer
- ...

Zum Download gibt es die Unit glVBO.pas auch schon. In dem Packet ist auch eine kleine Beispielanwendung enthalten.

Zum Meinungsthread


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 45 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.111s | 18 Queries | GZIP : On ]