glVertexAttrib
Inhaltsverzeichnis
glVertexAttrib
Name
glVertexAttrib - Verändert den Wert eines generischen Vertexattributs
Delphi-Spezifikation
procedure glVertexAttrib1f(index : GLuint; v0 : GLfloat);
procedure glVertexAttrib1s(index : GLuint; v0 : GLshort);
procedure glVertexAttrib1d(index : GLuint; v0 : GLdouble);
procedure glVertexAttrib2f(index : GLuint; v0 : GLfloat; v1 : GLfloat);
procedure glVertexAttrib2s(index : GLint; v0 : GLshort; v1 : GLshort);
procedure glVertexAttrib2d(index : GLuint; v0 : GLdouble; v1 : GLdouble);
procedure glVertexAttrib3f(index : GLuint; v0 : GLfloat; v1 : GLfloat; v2 : GLfloat);
procedure glVertexAttrib3s(index : GLuint; v0 : GLsingle; v1 : GLsingle; v2 : GLsingle);
procedure glVertexAttrib3d(index : GLuint; v0 : GLdouble; v1 : GLdouble; v2 : GLdouble);
procedure glVertexAttrib4f(index : GLuint; v0 : GLfloat; v1 : GLfloat; v2 : GLfloat; v3 : GLfloat);
procedure glVertexAttrib4s(index : GLuint; v0 : GLsingle; v1 : GLsingle; v2 : GLsingle; v3 : GLsingle);
procedure glVertexAttrib4d(index : GLuint; v0 : GLdouble; v1 : GLdouble; v2 : GLdouble; v3 : GLdouble);
procedure glVertexAttrib4Nub(index : GLuint; v0 : GLubyte; v1 : GLubyte; v2 : GLubyte; v3 : GLubyte);
Parameter
index | Gibt den Index des generischen Vertexattributs an, das verändert werden soll. |
---|---|
v0, v1, v2, v3 | Gibt die neuen Werte für das angegebene Vertexattribut an. |
Delphi-Spezifikation
procedure glVertexAttrib1fv(index : GLuint; const v : PGLfloat);
procedure glVertexAttrib1sv(index : GLuint; const v : PGLshort);
procedure glVertexAttrib1dv(index : GLuint; const v : PGLdouble);
procedure glVertexAttrib2fv(index : GLuint; const v : PGLfloat);
procedure glVertexAttrib2sv(index : GLuint; const v : PGLshort);
procedure glVertexAttrib2dv(index : GLuint; const v : PGLdouble);
procedure glVertexAttrib3fv(index : GLuint; const v : PGLfloat);
procedure glVertexAttrib3sv(index : GLuint; const v : PGLshort);
procedure glVertexAttrib3dv(index : GLuint; const v : PGLdouble);
procedure glVertexAttrib4fv(index : GLuint; const v : PGLfloat);
procedure glVertexAttrib4sv(index : GLuint; const v : PGLshort);
procedure glVertexAttrib4dv(index : GLuint; const v : PGLdouble);
procedure glVertexAttrib4iv(index : GLuint; const v : PGLuint);
procedure glVertexAttrib4bv(index : GLuint; const v : PGLbyte);
procedure glVertexAttrib4ubv(index : GLubyte; const v : PGLubyte);
procedure glVertexAttrib4usv(index : GLuint; const v : PGLushort);
procedure glVertexAttrib4uiv(index : GLuint; const v : PGLuint);
procedure glVertexAttrib4Nbv(index : GLuint; const v : PGLbyte);
procedure glVertexAttrib4Nsv(index : GLuint; const v : PGLshort);
procedure glVertexAttrib4Niv(index : GLuint; const v : PGLint);
procedure glVertexAttrib4Nubv(index : GLuint; const v : PGLubyte);
procedure glVertexAttrib4Nusv(index : GLuint; const v : PGLushort);
procedure glVertexAttrib4Nuiv(index : GLuint; const v : PGLuint);
Parameter
index | Gibt den Index des generischen Vertexattributs an, das verändert werden soll. |
---|---|
v | Gibt einen Pointer zu einem Array von Werten an, das für das generische Vertexattribut verwendet wird. |
Beschreibung
OpenGL definiert eine bestimmte Anzahl an Standard-Vertexattributen, die Anwendungen mit den Standard-Eigenschaften der API (Farbe, Normalen, Texturkoordinaten, etc.) verändern können. Die glVertexAttrib-Funktionen ermöglichen es Anwendungen, generische Vertexattribute in ausgewiesene Orte abzuspeichern.
Generische Attribute sind als Werte mit vier Komponenten definiert, die in einem Array organisiert sind. Das erste Element dieses Arrays hat die Nummer 0 und die Größe des Arrays wird durch die Implementations-abhängige Konstante GL_MAX_VERTEX_ATTRIBS angegeben. Einzelne Elemente dieses Arrays können durch einen Aufruf von glVertexArray - indem der Index des zu verändernden Elements und der neue Wert angegeben werden - modifiziert werden.
Diese Befehle können dazu verwendet werden, eine, zwei, drei oder alle vier Komponenten eines generischen Vertexattributs - spezifiziert mit index - anzugeben. Eine 1 im Namen des Befehls zeigt an, dass nur ein Wert bearbeitet wird und wird dazu verwendet, die erste Komponente des generischen Vertexattributs zu verändern. Die ersten und zweiten Komponenten werden auf 0 und die vierte Komponente auf 1 gesetzt. Analog dazu verändert ein Befehl mit einer 2 nur die ersten zwei Komponenten, die dritte wird auf 0, die vierte auf 1 gesetzt. Eine 3 im Namen des Befehls zeigt an, dass Werte für die ersten drei Komponenten vorliegen, die vierte Komponente wird auf 1 gesetzt. Eine 4 im Namen bewirkt, dass für alle vier Komponenten neue Werte vorliegen.
Die Buchstaben s, f, i, d, ub, us und ui zeigen an, ob die Argumente vom Typ short (in Delphi: Shortint), float (Delphi: Single), int (Delphi: Integer), unsigned byte (Delphi: Byte), unsigned short oder unsigned int (Delphi: Cardinal) sind. Wenn v an den Namen angehängt wurde, kann der Befehl einen Pointer auf ein Array dieser Werte verarbeiten. Die Befehle, die ein N beinhalten, bewirken, dass die Argumente aus Festkommazahlen bestehen, die auf einen normierten Bereich skaliert werden, wie in der OpenGL-Spezifikation vorgegeben wurde. Vorzeichenbehaftete Werte sind als Festkommazahlen im Bereich [-1, 1] und Werte ohne Vorzeichen als Festkommazahlen im Bereich [0, 1] zu verstehen.
Attributvariablen der OpenGL-Shading-Language können vom Typ mat2, mat3 oder mat4 sein. Attribute dieser Typen können durch glVertexAttrib geladen werden. Matrizen müssen in aufeinanderfolgende generische Attribut-Slots mit Spalten-Sortierung geladen werden, in denen jeweils eine Spalte einen Attribut-Slot repräsentiert.
Eine benutzerdefinierte Attributvariable, die in einem Vertexshader deklariert wurde, kann durch einen Aufruf von glBindAttribLocation an einen generischen Attributindex gebunden werden. Das ermöglicht es Anwendungen, verständlichere Variablennamen im Vertexshader zu verwenden. Eine Veränderung am spezifizierten generischen Vertexattribut wird sofort auch an der entsprechenden Attributvariable im Vertexshader durchgeführt.
Die Verbindung zwischen einem generischen Vertexattriut-Index und einer benutzerdefinierten Attributvariable in einem Vertexshader ist Teil des States des Programmobjekts, der aktuelle Wert des generischen Vertexattributs hingegen nicht. Der Wert jedes generischen Vertexattributs ist Teil des aktuellen States, genauso wie die Standard-Vertexattribute und wird auch verwaltet, wenn ein anderes Programmobjekt verwendet wird.
Eine Anwendung kann generische Vertexattribute frei verändern, wenn sie nicht an eine Vertexshader-Attributvariable gebunden sind. Diese Werte werden einfach als Teil des aktuellen States verwaltet und der Vertexshader greift nicht auf sie zu. Wenn ein an eine Attributvariable in einem Vertexshadergenerisches gebundenes Vertexattribut nicht aktualisiert wird, während der Vertexshader ausgeführt wird, verwendet der Vertexshader mehrmals den aktuellen Wert für das generische Vertexattribut.
Das generische Vertexattribut mit dem Index 0 ist das gleiche wie das Vertexpositions-Attribut, das zuvor von OpenGL definiert wurde. Ein Aufruf von glVertex2*, glVertex3* oder glVertex4* ist einem Aufruf von glVertexAttrib mit dem Index 0 vollkommen gleichwertig. Ein Vertexshader kann auf das generische Vertexattribut 0 mit der vordefinierten Attributvariable gl_Vertex zugreifen. Es gibt keine Werte für das generische Vertexattribut 0. Dies ist das einzige generische Vertexattribut mit dieser Eigenschaft; Befehle, um andere Standard-Vertexattribute festzulegen, können frei mit entsprechenden Befehlen für alle anderen generischen Vertexattribute vermischt werden.
Hinweise
glVertexAttrib ist nur verfügbar, wenn die verwendete OpenGL-Version größer gleich 2.0 ist.
Generische Vertexattribute können jederzeit aktualisiert werden. Entsprechend kann glVertexAttrib auch zwischen glBegin und glEnd aufgerufen werden.
Es ist einer Anwendung möglich, mehr als einen Attributnamen mit dem selben generischen Vertexattribut-Index zu verknüpfen. Dies wird als Aliasing (nicht Antialiasing) bezeichnet und ist nur erlaubt, wenn nur eine der mit einem Alias versehenen Attributvariablen im Vertexshader aktiv ist oder wenn kein Pfad durch den Vertexshader mehr als eines der Attribute verbraucht, die durch Aliasing auf den selben Ort verweisen. OpenGL-Implementationen prüfen Aliasing auber nicht zwangsläufig auf Fehler, sie können davon ausgehen, dass Aliasing nicht auftritt und sie dürfen Optimierungen anbringen, die nur funktionieren, wenn kein Aliasing verwendet wird.
Es gibt keine Möglichkeit, Standard-Vertexattribute zu verknüpfen; dadurch ist es nicht möglich, Standard-Attribute mit generischen Attributen durch ein Alias zu verknüpfen.
Fehlermeldungen
GL_INVALID_VALUE wird generiert, wenn index größer oder gleich GL_MAX_VERTEX_ATTRIBS ist.
Zugehörige Wertrückgaben
glGet mit Token GL_CURRENT_PROGRAM
glGetActiveAttrib mit dem Argument program und dem Index einer aktiven Attributvariable
glGetAttribLocation mit den Argumenten program und einem Attributvariablen-Namen
glGetVertexAttrib mit den Argumenten GL_CURRENT_VERTEX_ATTRIB und index