glUseProgram: Unterschied zwischen den Versionen
K (=Siehe auch=) |
|||
Zeile 88: | Zeile 88: | ||
---- | ---- | ||
[[glAttachObjectARB]], [[glCompileShaderARB]], [[glDetachObjectARB]], [[glLinkProgramARB]], [[glValidateProgramARB]]<br> | [[glAttachObjectARB]], [[glCompileShaderARB]], [[glDetachObjectARB]], [[glLinkProgramARB]], [[glValidateProgramARB]]<br> | ||
+ | '''Hintergrundwissen''' : [[Shader]]<br> | ||
[http://developer.3dlabs.com/openGL2/slapi/UseProgramObjectARB.htm Englische Originalversion] (Copyright 3DLabs Inc.) | [http://developer.3dlabs.com/openGL2/slapi/UseProgramObjectARB.htm Englische Originalversion] (Copyright 3DLabs Inc.) |
Version vom 12. Juli 2004, 12:20 Uhr
Inhaltsverzeichnis
glUseProgramObjectARB
Name
glUseProgramObjectARB - Aktiviert Shader und ersetzt die passenden Teile der festen Funktionspipeline durch diese.
Delphi-Spezifikation
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
glUseProgramObjectARB 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 glAttachObjectARB an das Programmobjekt bindet, diese erfolgreich mit glCompileShaderARB kompiliert und danach mit glLinkProgramARB 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_ARB 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_ARB 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, ausser 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_ARB beinhaltet, aber keine Shaderobjekte vom Typ GL_FRAGMENT_SHADER_ARB, 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_ARB vorhanden ist, aber keiner vom Typ GL_VERTEX_SHADER_ARB. 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 glUseProgramObjectARB aufgerufen wird.
Fehlermeldungen
GL_INVALID_VALUE wenn programObj weder 0 noch einem gültigen Objekthandle entspricht.
GL_INVALID_OPERATION wird generierrt wenn programObj nicht vom Typ GL_PROGRAM_OBJECT_ARB ist.
GL_INVALID_OPERATION wird generiert wenn das Programm nicht installiert werden konnte.
GL_INVALID_OPERATION wird generiert wenn glUseProgramObjectARB zwischen einem glBegin und dem zugehörigen glEnd aufgerufen wird.
Zugehörige Wertrückgaben
glGetHandleARB mit dem Argument programObj.
glGetAttachedObjectsARB mit dem Argument programObj.
glGetActiveAttribARB mit dem Argument programObj.
Siehe auch
glAttachObjectARB, glCompileShaderARB, glDetachObjectARB, glLinkProgramARB, glValidateProgramARB
Hintergrundwissen : Shader
Englische Originalversion (Copyright 3DLabs Inc.)