glUseProgram

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glUseProgram (glUseProgramObjectARB)

Name

glUseProgram - Aktiviert Shader und ersetzt die passenden Teile der festen Funktionspipeline durch diese.


Delphi-Spezifikation

procedure glUseProgram(programObj : GLuint);
procedure glUseProgramObjectARB(programObj : GLHandleARB);


Parameter

programObj Handle des Programmobjektes, dessen kompilierte und gelinkte Shader als Ersatz für die feste Funktionspipeline genutzt werden sollen.


Beschreibung

glUseProgram installiert den Satz der im Programm gebundenen Shader als Teil der aktuellen Renderpipeline. Ein Satz ausführbarer Shader wird in einem Programm erstellt, indem man diese mittels glAttachShader an das Programmobjekt bindet, diese erfolgreich mit glCompileShader kompiliert und danach mit glLinkProgram in das Programmobjekt linkt.

Ein Programmobjekt behinhaltet dann einen ausführbaren Shader der auf dem programmierbaren Vertexprozessor läuft, sobald man ein oder mehrere Shaderobjekte vom Typ GL_VERTEX_SHADER erfolgreich kompiliert und gelinkt hat. Entsprechend beinhaltet ein Programmobjekt einen ausführbaren Shader der auf dem programmierbaren Fragmentprozessor läuft, wenn ein oder meherer Shaderobjekte vom Typ GL_FRAGMENT_SHADER erfolgreich kompiliert und gelinkt wurden.

Das erfolgreiche Installieren eines ausführbaren Shaderprogrammes auf einem programmierbaren Prozessor sorgt dafür, dass die entsprechende feste Funktionspipeline der OpenGL deaktiviert ist. Wenn ein Vertexshader erfolgreich installiert wurde, dann werden folgende Bereiche der festen GL-Funktionspipeline deaktiviert :

  • Die Modelansichtsmatrix wird nicht auf Vertexkoordinaten angewandt.
  • Die Projektionsmatrix wird nicht auf Vertexkoordinaten angewandt.
  • Die Texturenmatrix wird nicht auf Texturkoordinaten angewandt.
  • Normale werden nicht in Betrachtungskoordinaten(Eye-Space) transformiert.
  • Normale werden nicht normalisiert bzw. reskaliert.
  • Normalisierung von evaluierten Normalen bei Nutzung von GL_AUTO_NORMAL wird nicht ausgeführt.
  • Texturkoordinaten werden nicht automatisch generiert.
  • Es wird keine per-Vertex Beleuchtung durchgeführt.
  • Farbmaterial-Berechnungen werden nicht durchgeführt.
  • Farbindex-Beleuchtung wird nicht durchgeführt.
  • Primäre und sekundäre Farbwerte werden nicht geclampt. (Deutsche Übersetzung für den Begriff klingt leider zu entfernt --Sascha Willems 12:38, 12. Jul 2004 (CEST))
  • Die obere Liste gilt auch beim Setzen der Rasterposition.


Der installierte Vertexshader muss daher jegliche aus obiger Liste benötigte Funktionalität selbst implementieren. Entsprechend werden folgende Teile der festen GL-Funktionspipeline deaktiviert, wenn ein Fragmentshader erfolgreich installiert wurde:

  • Texturumgebung und Texturfunktionen werden nicht angewandt.
  • Textur-Vergleichsmodi werden nicht angewandt.
  • Texturanwendung wird nicht berücksichtigt, außer der Tatsache dass Textureinheiten aktiviert bzw. deaktiviert werden.
  • Farbsumme wird nicht berechnet.
  • Nebel wird nicht berechnet.

Genau wie beim Vertexshader muss auch hier in einem Fragmentshader jegliche Funktionalität, die aus obiger Liste benötigt wird, selbst implementiert werden.

Während ein Programmobjekt aktiv ist, kann eine Anwendung die angehangenen Shaderobjekte verändern, angehangene Shaderobjekte kompilieren, zusätzliche Shaderobjekte anhängen und Shaderobjekte wieder entfernen. Keine dieser Operationen wird den Satz der ausführbaren Shader beeinflussen, die bereits Teil des aktuellen Status sind. Das Neulinken eines Programmobjektes dass in Benutzung ist, führt jedoch dazu dass die neu angehangenen Shader als Teil der Renderpipeline installiert werden, sofern der Linkvorgang erfolgreich war.

Wenn ein Programmobjekt Shader vom Typ GL_VERTEX_SHADER beinhaltet, aber keine Shaderobjekte vom Typ GL_FRAGMENT_SHADER, dann wird der Vertexshader installiert und für die Fragmentberechnungen die feste GL-Funktionspipeline genutzt. Genau umgekehrt verhält es sich wenn zwar ein Shader vom Typ GL_FRAGMENT_SHADER vorhanden ist, aber keiner vom Typ GL_VERTEX_SHADER. In diesem Falle wir der Fragmentshader installiert und für die Vertexberechnungen wird die feste Funktionspipeline genutzt. Wenn ein Programm mit der ID 0 gebunden wird, wird sowohl für Vertex- als auch Fragmentberechnungen die feste Funktionspipeline genutzt.


Hinweise

Änderungen die an einem Programmobjekt in einem Renderkontext getätigt werden, müssen nicht auch unbedingt Änderungen in einem anderen Renderkontext (der dieses Programmobjekt auch nutzt) hervorrufen, solange dort nicht explizit glUseProgram aufgerufen wird.


Fehlermeldungen

GL_INVALID_VALUE wenn programObj weder 0 noch einem gültigen Objekthandle entspricht.

GL_INVALID_OPERATION wird generiert wenn programObj nicht vom Typ GL_PROGRAM_OBJECT ist.

GL_INVALID_OPERATION wird generiert wenn das Programm nicht installiert werden konnte.

GL_INVALID_OPERATION wird generiert wenn glUseProgram zwischen einem glBegin und dem zugehörigen glEnd aufgerufen wird.



Zugehörige Wertrückgaben

glGet mit dem Argument programObj.

glGetAttachedShaders mit dem Argument programObj.

glGetActiveAttrib mit dem Argument programObj.

Siehe auch

glAttachShader, glCompileShader, glDetachShader, glLinkProgram, glValidateProgram


Hintergrundwissen : Shader


Englische Originalversion (Copyright 3DLabs Inc.)