glVertexAttrib: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Kategorie GL3 hinzugefügt)
K (Siehe auch)
 
Zeile 146: Zeile 146:
  
 
[[Kategorie:GL|VertexAttrib]]
 
[[Kategorie:GL|VertexAttrib]]
[[Kategorie:GL3]]
+
[[Kategorie:GL3|VertexAttrib]]

Aktuelle Version vom 21. Februar 2014, 18:05 Uhr

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


Siehe auch

glBindAttribLocation, glVertex, glVertexAttribPointer