glBufferData: Unterschied zwischen den Versionen
K (Kategorisierung GL1.5) |
|||
Zeile 143: | Zeile 143: | ||
[[Kategorie:GL|BufferData]] | [[Kategorie:GL|BufferData]] | ||
[[Kategorie:GL1.5|BufferData]] | [[Kategorie:GL1.5|BufferData]] | ||
+ | [[Kategorie:GL3]] |
Version vom 15. Juni 2011, 20:35 Uhr
Inhaltsverzeichnis
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.
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