glUseProgram: Unterschied zwischen den Versionen
DGLBot (Diskussion | Beiträge) K (GlUseProgramObject wurde nach glUseProgramObject verschoben) |
I0n0s (Diskussion | Beiträge) (auf glUseProgram umgeändert) |
||
Zeile 1: | Zeile 1: | ||
− | = | + | = glUseProgram (glUseProgramObjectARB) = |
+ | |||
+ | |||
− | |||
== Name == | == Name == | ||
− | ''' | + | '''glUseProgram''' - Aktiviert Shader und ersetzt die passenden Teile der festen Funktionspipeline durch diese. |
+ | |||
+ | |||
− | |||
== Delphi-Spezifikation == | == Delphi-Spezifikation == | ||
− | procedure ''' | + | procedure '''glUseProgram'''(''programObj'' : GLuint); |
procedure '''glUseProgramObjectARB'''(''programObj'' : GLHandleARB); | procedure '''glUseProgramObjectARB'''(''programObj'' : GLHandleARB); | ||
− | + | ||
== Parameter == | == Parameter == | ||
− | + | {| border="1" rules="all" | |
− | + | ! ''programObj'' | |
− | + | | Handle des Programmobjektes, dessen kompilierte und gelinkte Shader als Ersatz für die feste Funktionspipeline genutzt werden sollen. | |
− | + | |} | |
− | + | ||
− | |||
− | |||
== Beschreibung == | == 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. | 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 : | 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 : | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | 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 : | + | *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 --[[Benutzer:Sascha Willems|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. | Genau wie beim Vertexshader muss auch hier in einem Fragmentshader jegliche Funktionalität, die aus obiger Liste benötigt wird, selbst implementiert werden. | ||
Zeile 57: | Zeile 56: | ||
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. | 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 == | == 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 ''' | + | Ä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 == | == Fehlermeldungen == | ||
'''GL_INVALID_VALUE''' wenn ''programObj'' weder 0 noch einem gültigen Objekthandle entspricht. | '''GL_INVALID_VALUE''' wenn ''programObj'' weder 0 noch einem gültigen Objekthandle entspricht. | ||
Zeile 69: | Zeile 70: | ||
'''GL_INVALID_OPERATION''' wird generiert wenn das Programm nicht installiert werden konnte. | '''GL_INVALID_OPERATION''' wird generiert wenn das Programm nicht installiert werden konnte. | ||
− | '''GL_INVALID_OPERATION''' wird generiert wenn ''' | + | '''GL_INVALID_OPERATION''' wird generiert wenn '''glUseProgram''' zwischen einem [[glBegin]] und dem zugehörigen [[glEnd]] aufgerufen wird. |
+ | |||
+ | |||
− | |||
== Zugehörige Wertrückgaben == | == Zugehörige Wertrückgaben == | ||
Zeile 80: | Zeile 82: | ||
[[glGetActiveAttrib]] mit dem Argument ''programObj''. | [[glGetActiveAttrib]] mit dem Argument ''programObj''. | ||
− | + | ||
+ | |||
+ | |||
== Siehe auch == | == Siehe auch == | ||
− | [[ | + | [[glAttachShader]], [[glCompileShader]], [[glDetachShader]], [[glLinkProgram]], [[glValidateProgram]] |
− | '''Hintergrundwissen''' : [[Shader]] | + | |
+ | |||
+ | '''Hintergrundwissen''' : [[Shader]] | ||
+ | |||
+ | |||
[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.) | ||
[[Kategorie:GL|UseProgramObjectARB]] | [[Kategorie:GL|UseProgramObjectARB]] | ||
[[Kategorie:SHADER_OBJECTS|UseProgramObject]] | [[Kategorie:SHADER_OBJECTS|UseProgramObject]] |
Version vom 15. April 2006, 14:27 Uhr
Inhaltsverzeichnis
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, 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 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
glGetHandle mit dem Argument programObj.
glGetAttachedObjects mit dem Argument programObj.
glGetActiveAttrib mit dem Argument programObj.
Siehe auch
glAttachShader, glCompileShader, glDetachShader, glLinkProgram, glValidateProgram
Hintergrundwissen : Shader
Englische Originalversion (Copyright 3DLabs Inc.)