glVertexAttribPointer: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Fehlermeldungen)
K
 
(13 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 34: Zeile 34:
  
 
== Beschreibung ==  
 
== Beschreibung ==  
'''glVertexAttribPointer''' legt fest wo sich ein generischer Array von Vertexattributen befindet und wie dieser aufgebaut ist. Die übergebenen Argumente werden Clientseitig gespeichert. Ist ''normalized'' '''GL_TRUE''' dann werden vorzeichenbehaftete Integer Werte auf den Bereich <nowiki>[-1,1]</nowiki> und vorzeichenlose auf den Bereich <nowiki>[0,1]</nowiki> übertragen.
+
'''glVertexAttribPointer''' legt fest, wo sich ein generisches Array von Vertexattributen befindet und wie dieses aufgebaut ist. Die übergebenen Argumente werden Clientseitig gespeichert. Ist ''normalized'' '''GL_TRUE''' dann werden vorzeichenbehaftete Integer Werte auf den Bereich <nowiki>[-1,1]</nowiki> und vorzeichenlose auf den Bereich <nowiki>[0,1]</nowiki> übertragen.
  
Bevor der Array benutzt werden kann, muss er mit [[glEnableVertexAttribArray]] and [[glDisableVertexAttribArray]] aktiviert werden. Hierbei muss der gleiche ''index'' angegeben werden.
+
Bevor das Array benutzt werden kann, muss es mit [[glEnableVertexAttribArray]] aktiviert werden (deaktivieren entsprechend mit [[glDisableVertexAttribArray]]). Hierbei muss der gleiche ''index'' angegeben werden.
  
Wenn der Array aktiviert ist, wird er bei [[glDrawArrays]], [[glDrawElements]], [[glDrawRangeElements]], [[glArrayElement]], [[glMultiDrawElements]], or [[glMultiDrawArrays]] Aufrufen verwendet.
+
Wenn das Array aktiviert ist, wird es bei [[glDrawArrays]], [[glDrawElements]], [[glDrawRangeElements]], [[glArrayElement]], [[glMultiDrawElements]], oder [[glMultiDrawArrays]] Aufrufen verwendet.
 +
 
 +
== Beispiele ==
 +
Angenommen, man möchte, dass ein Vertex aus Position und Normalenvektor besteht. Dann gibt es im Wesentlichen zwei verschiedene Möglichkeiten, diese Daten im Speicher abzulegen: Abwechselnd (interleaved) oder nacheinander, also zuerst alle Positionsdaten und dann alle Normalenvektoren. In den folgenden Beispielen habe Position den ''index''=0 und Normal den ''index''=1. Außerdem wird davon ausgegangen, dass ein Vektor aus 3 floats (32-bit Fließkommazahl) besteht, sodass die Größe eines einzelnen Vektors 12 Byte sind.
 +
=== Interleaved ===
 +
<syntaxhighlight lang="pascal">
 +
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, Pointer(0)); 
 +
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, Pointer(12));
 +
// Bei Pointer(0) alternativ nil
 +
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, nil);   
 +
</syntaxhighlight>
 +
Nach diesen beiden Funktionsaufrufen wird OpenGL den Inhalt des VBOs so interpretieren:
 +
{| border="1" rules="all"
 +
! Byte
 +
! Inhalt
 +
|-
 +
|  0
 +
| Position
 +
|-
 +
| 12
 +
| Normal
 +
|-
 +
| 24
 +
| Position
 +
|-
 +
| 36
 +
| Normal
 +
|-
 +
| 48
 +
| Position
 +
|-
 +
| 60
 +
| Normal
 +
|}
 +
<br>
 +
 
 +
=== Nacheinander ===
 +
<syntaxhighlight lang="pascal">
 +
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, Pointer(0));  // alternativ auch stride=0
 +
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 12, Pointer(36));  // alternativ auch stride=0
 +
</syntaxhighlight>
 +
Nach diesen beiden Funktionsaufrufen wird OpenGL den Inhalt des VBOs so interpretieren:
 +
{| border="1" rules="all"
 +
! Byte
 +
! Inhalt
 +
|-
 +
|  0
 +
| Position
 +
|-
 +
| 12
 +
| Position
 +
|-
 +
| 24
 +
| Position
 +
|-
 +
| 36
 +
| Normal
 +
|-
 +
| 48
 +
| Normal
 +
|-
 +
| 60
 +
| Normal
 +
|}
  
 
== Hinweise ==
 
== Hinweise ==
Zeile 49: Zeile 112:
  
 
Die Parameter des generischen Vertexattribut-Arrays werden auf der Client Seite gespeichert, und können daher nicht mit [[glPushAttrib]] und [[glPopAttrib]] gespeichert und wiederhergestellt werden. Statt dessen verwendet man [[glPushClientAttrib]] und [[glPopClientAttrib]].
 
Die Parameter des generischen Vertexattribut-Arrays werden auf der Client Seite gespeichert, und können daher nicht mit [[glPushAttrib]] und [[glPopAttrib]] gespeichert und wiederhergestellt werden. Statt dessen verwendet man [[glPushClientAttrib]] und [[glPopClientAttrib]].
 +
 +
Wenn beim Aufruf von '''glVertexAttribPointer''' ein VBO gebunden ist, muss dieses nicht nochmals vor dem Zeichnen z.B. mittels [[glDrawArrays]] gebunden werden.
  
 
== Fehlermeldungen ==
 
== Fehlermeldungen ==
Zeile 61: Zeile 126:
 
== Zugehörige Wertrückgaben ==
 
== Zugehörige Wertrückgaben ==
 
* [[glGet]] mit Token [[glGet#GL_MAX_VERTEX_ATTRIBS|GL_MAX_VERTEX_ATTRIBS]]
 
* [[glGet]] mit Token [[glGet#GL_MAX_VERTEX_ATTRIBS|GL_MAX_VERTEX_ATTRIBS]]
* [[glGetVertexAttrib]] mit dem Argument index und dem Namen des Vertex Attribut Parameters.
+
* [[glGet]] mit Token [[glGet#GL_ARRAY_BUFFER_BINDING|GL_ARRAY_BUFFER_BINDING]]
* [[glGetVertexAttribPointer]] mit dem Argutmenten index und GL_VERTEX_ATTRIB_ARRAY_POINTER
+
* [[glGetVertexAttrib]] mit dem Argument ''index'' und einem der folgenden Attribut Parameter: '''GL_VERTEX_ATTRIB_ARRAY_ENABLED, GL_VERTEX_ATTRIB_ARRAY_SIZE, GL_VERTEX_ATTRIB_ARRAY_TYPE, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, GL_VERTEX_ATTRIB_ARRAY_STRIDE''' sowie  '''GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING'''.
 +
* [[glGetVertexAttribPointer]] mit dem Argutmenten ''index'' und '''GL_VERTEX_ATTRIB_ARRAY_POINTER'''
  
 +
== Siehe auch ==
 +
 +
Hintergrundwissen: [[VBO ohne glInterleavedArrays]] <br>
 +
 +
[[Vertex Array Object]]
  
== Siehe auch ==
 
 
[[glArrayElement]], [[glBindAttribLocation]], [[glDisableVertexAttribArray]], [[glDrawArrays]], [[glDrawElements]], [[glDrawRangeElements]], [[glEnableVertexAttribArray]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glPopClientAttrib]], [[glPushClientAttrib]], [[glVertexAttrib]]
 
[[glArrayElement]], [[glBindAttribLocation]], [[glDisableVertexAttribArray]], [[glDrawArrays]], [[glDrawElements]], [[glDrawRangeElements]], [[glEnableVertexAttribArray]], [[glMultiDrawArrays]], [[glMultiDrawElements]], [[glPopClientAttrib]], [[glPushClientAttrib]], [[glVertexAttrib]]
  
 
[[Kategorie:GL|VertexAttribPointer]]
 
[[Kategorie:GL|VertexAttribPointer]]
 +
[[Kategorie:GL3|VertexAttribPointer]]

Aktuelle Version vom 16. Januar 2018, 17:53 Uhr

glVertexAttribPointer

Name

glVertexAttribPointer - Definiert ein generisches Vertexattribut-Array


Delphi-Spezifikation

procedure glVertexAttribPointer(index : GLuint; size : GLint; type : GLenum; 
normalized : GLboolean; stride : GLsizei; const pointer : PGLvoid)


Parameter

index Gibt den Index des zu verändernden generischen Vertexattributs an.
size Gibt die Anzahl der Werte für jedes Element des generischen Vertexattribut-Arrays an. Muss 1, 2, 3 oder 4 sein.
type Gibt den Datentyp der Komponenten im Array an. Die symbolischen Konstanten GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT und GL_DOUBLE sind zugelassen.
normalized Gibt an, ob Festkomma-Werte normalisiert werden sollen (GL_TRUE) oder direkt als Festkomma-Werte konvertiert werden sollen (GL_FALSE), wenn auf sie zugegriffen wird.
stride Gibt den Byte-Offset zwischen aufeinanderfolgenden Attribut-Werten an. Wenn stride gleich 0 (der Standard-Wert) ist, werden die Attributvariablen als direkt aufeinanderfolgend im Array angenommen.
pointer Ein Pointer zu der ersten Komponente des ersten Attribut-Werts im Array.


Beschreibung

glVertexAttribPointer legt fest, wo sich ein generisches Array von Vertexattributen befindet und wie dieses aufgebaut ist. Die übergebenen Argumente werden Clientseitig gespeichert. Ist normalized GL_TRUE dann werden vorzeichenbehaftete Integer Werte auf den Bereich [-1,1] und vorzeichenlose auf den Bereich [0,1] übertragen.

Bevor das Array benutzt werden kann, muss es mit glEnableVertexAttribArray aktiviert werden (deaktivieren entsprechend mit glDisableVertexAttribArray). Hierbei muss der gleiche index angegeben werden.

Wenn das Array aktiviert ist, wird es bei glDrawArrays, glDrawElements, glDrawRangeElements, glArrayElement, glMultiDrawElements, oder glMultiDrawArrays Aufrufen verwendet.

Beispiele

Angenommen, man möchte, dass ein Vertex aus Position und Normalenvektor besteht. Dann gibt es im Wesentlichen zwei verschiedene Möglichkeiten, diese Daten im Speicher abzulegen: Abwechselnd (interleaved) oder nacheinander, also zuerst alle Positionsdaten und dann alle Normalenvektoren. In den folgenden Beispielen habe Position den index=0 und Normal den index=1. Außerdem wird davon ausgegangen, dass ein Vektor aus 3 floats (32-bit Fließkommazahl) besteht, sodass die Größe eines einzelnen Vektors 12 Byte sind.

Interleaved

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, Pointer(0));  
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, Pointer(12));
// Bei Pointer(0) alternativ nil
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, nil);

Nach diesen beiden Funktionsaufrufen wird OpenGL den Inhalt des VBOs so interpretieren:

Byte Inhalt
0 Position
12 Normal
24 Position
36 Normal
48 Position
60 Normal


Nacheinander

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, Pointer(0));   // alternativ auch stride=0
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 12, Pointer(36));  // alternativ auch stride=0

Nach diesen beiden Funktionsaufrufen wird OpenGL den Inhalt des VBOs so interpretieren:

Byte Inhalt
0 Position
12 Position
24 Position
36 Normal
48 Normal
60 Normal

Hinweise

glVertexAttribPointer ist erst ab OpenGL Version 2.0 oder später verfügbar.

glVertexAttribPointer darf nicht zwischen glBegin und glEnd ausgeführt werden. Wird dies denoch gemacht, kann es sein das ein Fehler generiert wird. Es kann aber auch sein das kein Fehler generiert wird und der Zustand der Operation undefiniert ist.

glVertexAttribPointer ist üblicherweise auf der Client Seite implementiert.

Die Parameter des generischen Vertexattribut-Arrays werden auf der Client Seite gespeichert, und können daher nicht mit glPushAttrib und glPopAttrib gespeichert und wiederhergestellt werden. Statt dessen verwendet man glPushClientAttrib und glPopClientAttrib.

Wenn beim Aufruf von glVertexAttribPointer ein VBO gebunden ist, muss dieses nicht nochmals vor dem Zeichnen z.B. mittels glDrawArrays gebunden werden.

Fehlermeldungen

GL_INVALID_VALUE wird generiert, wenn index größer oder gleich GL_MAX_VERTEX_ATTRIBS ist.

GL_INVALID_VALUE wird generiert, wenn size nicht 1, 2, 3, oder 4 ist.

GL_INVALID_VALUE wird generiert, wenn stride negativ ist.

GL_INVALID_ENUM wird generiert, wenn type kein akzeptierter Wert ist.

Zugehörige Wertrückgaben

Siehe auch

Hintergrundwissen: VBO ohne glInterleavedArrays

Vertex Array Object

glArrayElement, glBindAttribLocation, glDisableVertexAttribArray, glDrawArrays, glDrawElements, glDrawRangeElements, glEnableVertexAttribArray, glMultiDrawArrays, glMultiDrawElements, glPopClientAttrib, glPushClientAttrib, glVertexAttrib