glLinkProgram

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glLinkProgramARB

Name

glLinkProgram - linkt die momentan an ein Programmobjekt gebundenen Shader, um daraus einen Satz ausführbarer Shader zu erstellen.



Delphi-Spezifikation

procedure glLinkProgram(programObj GLHandle);



Parameter

programObj Handle des Programmobjektes das gelinkt werden soll.


Beschreibung

glLinkProgram linkt die momentan an programObj gebundenen Shader, um daraus einen Satz ausführbarer Shader zu erstellen. Wenn Shaderobjekte vom Typ GL_VERTEX_SHADER an programObj angehangen sind, werden diese genutzt um einen ausführbaren Shader zu erstellen der auf dem programmierbaren Vertexprozessor abläuft. Sind Shaderobjekte vom Typ GL_FRAGMENT_SHADER an programObj angehangen, so werden diese genutzt um den ausführbaren Shader zu erstellen der auf dem programmierbaren Fragmentprozessor läuft.

Der Status des Linkvorgangs wird dabei als Teil des Objektstatus von programObj abgelegt, und ist GL_TRUE, wenn das Programmobjekt ohne Fehler gelinkt wurde, bzw. GL_FALSE, wenn dies nicht der Fall war. Abgefragt kann dieser Status über den Befehl glGetProgram mit den Argumenten programObj und GL_LINK_STATUS werden.

Als Ergebnis eines erfolgreichen Linkvorganges, werden alle dem Programm zugehörigen (aktiven) Uniformvariablen auf 0 gesetzt und alle aktiven Uniformwerte des Programmobjektes werden an einen Platz, gebunden dessen Status mittels glGetUniformLocation angefragt werden kann. Weiterhin werden zu diesem Zeitpunkt alle nutzerdefinierten Attributvariablen die noch nicht an einen generischen Vertex-Attribut-Index gebunden wurden, an einen solchen gebunden.

Das Linken eines Programmobjektes kann aus einer Vielzahl von Gründen fehlschlagen, die in der Sprachdefinition zur OpenGL-Shadersprache erläutert werden. Dinge die einen Fehler beim Linken verursachen können :

  • Die Anzahl der von der Implementation zur Verfügung gestellten Attributvariablen wurde überschritten.
  • Die Anzahl der von der Implementation zur Verfügung gestellten Uniformvariablen wurde überschritten.
  • Der Speicherplatz für Uniformvariablen wurde überschritten.
  • Die Anzahl der von der Implementation angebotenen Sampler wurde überschritten.
  • Der Haupt-Funktionskörper(main) fehlt bei Vertex- oder Fragmentshader.
  • Die Liste der im Vertexshader festgelegten Varying-Variablen unterscheidet sich von der im Fragmentshader.
  • Referenzen auf nicht-definierte Funktionen oder Variablen.
  • Eine verteilte globale Variable (shared global) wurde mit unterschiedlichen Typen oder Vorgabewerten deklariert.
  • Das binden einer generischen Attribut Matrix führt dazu, dass einige Zeilen der Matrix das durch GL_MAX_VERTEX_ATTRIBS vorgegeben Maximum überschreiten.
  • Einer oder mehrere der angehängte(n) Shader wurde nicht erfolgreich kompiliert.
  • Es wurden nicht genug aufeinanderfolgende Vertex-Attribut-Slots gefunden um Attributmatrizen zu binden.

Sobald ein Programmobjekt erfolgreich gelinkt wurde, können die in ihm enthaltenen, nun ausführbaren Shader, als Teil des aktuellen Renderstatuses via glUseProgram aktiviert werden. Ob der Linkvorgang erfolgreich war, und Informationen zu diesem Vorgang können über glGetProgramInfoLog aus dem Informationslog des Programmobjektes entnommen werden.

glLinkProgramARB wird nach einem erfolgreichen Linkvorgang die ausführbaren Shader als Teil des aktuellen Renderstatuses installieren, sofern das Programmobjekt bereits als aktuelles gesetzt wurde (über glUseProgram).

Wenn ein Programm Shader vom Typ GL_VERTEX_SHADER_ARB beinhaltet, aber keinen Shader vom Typ GL_FRAGMENT_SHADER_ARB, wird der Vertexshader gegen das Interface für die feste Fragmentberechnung gelinkt. Entsprechend wird ein Fragmentshader gegen das Interface für die feste Vertexberechnung gelinkt, wenn Shader vom Typ GL_FRAGMENT_SHADER_ARB, aber keiner vom Typ GL_VERTEX_PROGRAM_ARB enthalten ist.

Das Informationslog des Programmobjektes wird aktualisiert, und der Satz ausführbarer Shader wird generiert, sobald der Linkvorgang ausgeführt wird. Nach dem Linken steht es der Anwendung offen, nicht mehr benötigte Shaderobjekte zu modifizieren oder zu löschen. Keine dieser Operationen werden dann die bereits kompilierten Shader des Programmobjektes verändern.


Hinweise

glLinkProgram ist erst ab OpenGL Version 2.0 verfügbar. (Frühere Versionen können glLinkProgramARB enthalten.)

War das Linken erfolgreich gehen alle Linkinformationen zu einem vorhergehenden Linkversuch verloren (werden überschrieben). Das bedeutet z.B. das ein fehlgeschlagener Versuch nicht den alten Status von programObj wiederherstellt. Es können aber selbst dann noch einige Informationen von programObj ausgelesen werden. Siehe dazu glGetActiveAttrib und glGetActiveUniform.


Fehlermeldungen

GL_INVALID_VALUE wird generiert wenn programOjb kein gültiges Objekthandle ist.

GL_INVALID_OPERATION wird generiert wenn programObj nicht vom Typ GL_PROGRAM_OBJECT ist.

GL_INVALID_OPERATION wird generiert wenn glLinkProgram zwischen einem glBegin und dem passenden glEnd aufgerufen wird.


Zugehörige Wertrückgaben

glGet mit dem Token GL_CURRENT_PROGRAM.

glGetActiveAttrib mit dem Argument programObj und dem Index einer aktiven Attributvariable.

glGetActiveUniform mit dem Argument programObj und dem Index einer aktiven Uniformvariable.

glGetAttachedShaders mit dem Argument programObj.

glGetAttribLocation mit dem Argument programObj und dem Namen einer Attributvariable.

glGetProgram mit den Argumenten programObj und GL_LINK_STATUS.

glGetProgramInfoLog mit den Argumenten programObj

glGetUniform mit dem Argument programObj und dem Platz(Location) einer Uniformvariable.

glGetUniformLocation mit dem Argument programObj und dem Namen einer Uniformvariable.

glIsProgram



Siehe auch

glAttachShader, glBindAttribLocation, glCompileShader, glCreateProgram, glDeleteProgram, glDetachShader, glUniform, glUseProgram, glValidateProgram

Hintergrundwissen : Shader
Englische Orginalversion (Copyright 3DLabs Inc.)