glBufferData

Aus DGL Wiki
Version vom 21. Februar 2014, 17:51 Uhr von Glawesome (Diskussion | Beiträge) (Siehe auch)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

glBufferData

Name

glBufferData - erstellt und initialisiert den Datenspeicher eines Pufferobjektes.


Delphi-Spezifikation

procedure glBufferData(target: TGLenum; size: TGLsizei; const data: PGLvoid; usage: TGLenum); 


Parameter

target Bestimmt das Ziel des Pufferobjektes. Muss GL_ARRAY_BUFFER oder GL_ELEMENT_ARRAY_BUFFER sein.
size Definiert die Größe des Datenspeichers in basic machine units (meistens Bytes).
data Zeiger auf die Quelldaten im Arbeitsspeicher des Klienten.
usage Hinweis für die Benutzung der Daten. Akzeptiert werden GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ und GL_DYNAMIC_COPY.


Beschreibung

glBufferData ermöglicht es Datenspeicher für Pufferobjekte (VBO) zu erstellen und zu initialisieren.

Wenn data nicht NULL/NIL ist, werden die Quelldaten in den Datenspeicher des Pufferobjekts kopiert. Wenn data NULL/NIL ist, ist der Inhalt des Datenspeichers undefiniert.


target gibt an, welches der beiden (mit glBindBuffer) momentan gebundenen Pufferobjekte erstellt und initialisiert werden soll:

GL_ARRAY_BUFFER

Das momentan gebundene Puffer-Objekt zur Speicherung von Vertexarray-Daten.

GL_ELEMENT_ARRAY_BUFFER

Das momentan gebundene Puffer-Objekt zur Speicherung von Indexwerten für Vertexarrays.


usage enthält einen Performance-Hinweis für die Behandlung der Daten und kann folgende Werte annehmen:

GL_STREAM_DRAW

Der Inhalt des Datenspeichers wird einmal durch die Anwendung festgelegt und selten als Quelle für einen GL-Renderbefehl benutzt.

GL_STREAM_READ

Der Inhalt des Datenspeichers wird einmal zum Auslesen von Daten festgelegt und selten durch die Applikation abgefragt.

GL_STREAM_COPY

Der Inhalt des Datenspeichers wird einmal zum Auslesen von Daten festgelegt und selten als Quelle für einen GL-Renderbefehl benutzt.

GL_STATIC_DRAW

Der Inhalt des Datenspeichers wird einmal durch die Anwendung festgelegt und häufig als Quelle für einen GL-Renderbefehl benutzt.

GL_STATIC_READ

Der Inhalt des Datenspeichers wird einmal zum Auslesen von Daten festgelegt und häufig durch die Applikation abgefragt.

GL_STATIC_COPY

Der Inhalt des Datenspeichers wird einmal zum Auslesen von Daten festgelegt und häufig als Quelle für einen GL-Renderbefehl benutzt.

GL_DYNAMIC_DRAW

Der Inhalt des Datenspeichers wird wiederholt durch die Anwendung festgelegt und häufig als Quelle für einen GL-Renderbefehl benutzt.

GL_DYNAMIC_READ

Der Inhalt des Datenspeichers wird wiederholt zum Auslesen von Daten festgelegt und häufig durch die Applikation abgefragt.

GL_DYNAMIC_COPY

Der Inhalt des Datenspeichers wird wiederholt zum Auslesen von Daten festgelegt und häufig als Quelle für einen GL-Renderbefehl benutzt.


glBufferData zerstört jeden existierenden Datenspeicher des aktuell mit target gebundenen Puffer-Objektes und setzt dessen Zustandsvariablen folgendermaßen:

Name Wert
GL_BUFFER_SIZE size
GL_BUFFER_USAGE usage
GL_BUFFER_ACCESS GL_READ_WRITE
GL_BUFFER_MAPPED GL_FALSE
GL_BUFFER_MAP_POINTER NULL/NIL


Klienten müssen ihre Datenelemente im Speicher konsistent und abhängig von den Anforderungen der Klientplattform ausrichten. Zu diesem Zweck exisitert die zusätzliche Anforderung, dass der Versatz/Offset innerhalb eines Puffers zu einem Datensatz, der N basic machine units umfasst, ein Vielfaches von N sein muss.


Hinweise

glBufferData ist erst ab OpenGL Version 1.5 verfügbar!


usage dient nur als Performance-Hinweis. Der angegebene Wert beschränkt nicht den tatsächlichen Einsatz des Datenspeichers.

Info DGL.png Es ist allerdings vorstellbar, dass die Grafikkartenhersteller anhand des Wertes ihre Grafikspeicheraufteilung optimieren. Man solle sich aus Performancegründen möglichst an das angegebene Verhalten halten.


glBufferData und glBufferSubData definieren zwei neue Typen die auf 64-Bit Rechnern funktionieren. Analog zu intptr t in C gibt es den neuen Typ GLintptrARB welcher anstatt von GLint benutzt werden soll, wenn absehbar ist, dass die Werte größer als 2 Miliarden werden. Des Weiteren wird der Typ GLsizeiptrARB eingeführt, welcher anstatt von GLsizei benutzt werden soll, wenn absehbar ist, dass eine Anzahl größer als 2 Milliarden wird.


Beide Typen sind als vorzeichenbehaftete Ganzzahlen definiert welche groß genug sind um beliebige Zeiger zu enthalten. Daraus ergibt sich, dass sie auf Systemen mit 64-Bit Zeigern (oder mehr) eine große Menge Bits benutzen.


Puffer-Objekte, die durch Bindung eines unbenutzten Namens an GL_ARRAY_BUFFER und GL_ELEMENT_ARRAY_BUFFER erzeugt werden sind formal äquivalent, jedoch kann GL abhängig von der Anfangsbindung verschiedene Auswahlmöglichkeiten über die Implementation der Speicherung treffen. In einigen Fällen wird die Performance optimiert, indem Indexwerte und Arraydaten in getrennten Puffer-Objekten gespeichert und indem diese Pufferobjekte mit entsprechenden Bindungspunkten erzeugt werden.


Fehlermeldungen

GL_INVALID_ENUM wird generiert, wenn target kein zulässiger Wert übergeben wurde.

GL_INVALID_ENUM wird generiert, wenn usage kein zulässiger Wert übergeben wurde.

GL_OUT_OF_MEMORY wird generiert, wenn es OpenGL nicht möglich war einen Datenspeicher der geforderten Größe anzulegen.

GL_INVALID_VALUE wird generiert, wenn size negativ ist.


Zugehörige Wertrückgaben

glGetBufferParameter mit Token GL_BUFFER_SIZE gibt die Größe des Puffer-Objektes in basic machine units zurück.
glGetBufferParameter mit Token GL_BUFFER_USAGE gibt den Performance-Hinweis des aktuellen Puffer-Objektes zurück.
glGetBufferSubData mit target GL_ARRAY_BUFFER oder GL_ELEMENT_ARRAY_BUFFER gibt den Inhalt des Datenspeichers des aktuellen Puffer-Objektes zurück.


Siehe auch

glBindBuffer, glBufferSubData, glDeleteBuffers, glGenBuffers, glGetBufferParameter, glGetBufferPointerv, glGetBufferSubData, glIsBuffer, glMapBuffer, glUnmapBuffer