glLinkProgram

Aus DGL Wiki
Version vom 23. Juni 2005, 11:35 Uhr von Flash (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel wird gerade Offline bearbeitet!

Bitte haben Sie etwas Geduld und nehmen Sie keine Änderungen vor, bis der Artikel hochgeladen wurde.

(weitere Artikel)
WIP Offline.jpg



glLinkProgramARB


Name

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


Delphi-Spezifikation

procedure glLinkProgramARB(programObj GLhandleARB);


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

glGetActiveAttribARB mit dem Argument programObj.

glGetActiveUniformARB mit dem Argument programObj.

glGetInfoLogARB mit dem Argument programObj.

glGetObjectParameterARB mit den Argumenten programObj und GL_OBJECT_LINK_STATUS_ARB.

glGetUniformARB mit dem Argument programObj und dem Platz einer Uniformvariable.

glGetUniformLocationARB mit dem Argument programObj und dem Namen einer Uniformvariable.

glGetHandleARB mit dem Parameter GL_PROGRAM_OBJECT_ARB.


Siehe auch

glAttachObjectARB, glCompileShaderARB, glDetachObjectARB, glUniformARB, glUseProgramObjectARB, glValidateProgramARB
Hintergrundwissen : Shader
Englische Originalversion (Copyright 3DLabs Inc.)