glUseProgram: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (GlUseProgramObject wurde nach glUseProgramObject verschoben)
(auf glUseProgram umgeändert)
Zeile 1: Zeile 1:
= glUseProgramObject (glUseProgramObjectARB) =
+
= glUseProgram (glUseProgramObjectARB) =
 +
 
 +
 
  
<br>
 
 
== Name ==
 
== Name ==
'''glUseProgramObject''' - Aktiviert Shader und ersetzt die passenden Teile der festen Funktionspipeline durch diese.
+
'''glUseProgram''' - Aktiviert Shader und ersetzt die passenden Teile der festen Funktionspipeline durch diese.
 +
 
 +
 
  
<br>
 
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
  procedure '''glUseProgramObject'''(''programObj'' : GLHandle);
+
  procedure '''glUseProgram'''(''programObj'' : GLuint);
 
  procedure '''glUseProgramObjectARB'''(''programObj'' : GLHandleARB);
 
  procedure '''glUseProgramObjectARB'''(''programObj'' : GLHandleARB);
  
<br>
+
 
  
 
== Parameter ==
 
== Parameter ==
<table border=1 rules=all>
+
{| border="1" rules="all"
<tr>
+
! ''programObj''
<td>''programObj''</td>
+
| Handle des Programmobjektes, dessen kompilierte und gelinkte Shader als Ersatz für die feste Funktionspipeline genutzt werden sollen.
<td>Handle des Programmobjektes, dessen kompilierte und gelinkte Shader als Ersatz für die feste Funktionspipeline genutzt werden sollen.</td>
+
|}
</tr>
+
 
</table>
 
  
<br>
 
 
== Beschreibung ==  
 
== Beschreibung ==  
'''glUseProgramObject''' 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 [[glAttachObject]] an das Programmobjekt bindet, diese erfolgreich mit [[glCompileShader]] kompiliert und danach mit [[glLinkProgram]] in das Programmobjekt linkt.
+
'''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 :
<ul>
 
<li>Die Modelansichtsmatrix wird nicht auf Vertexkoordinaten angewandt.</li>
 
<li>Die Projektionsmatrix wird nicht auf Vertexkoordinaten angewandt.</li>
 
<li>Die Texturenmatrix wird nicht auf Texturkoordinaten angewandt.</li>
 
<li>Normale werden nicht in Betrachtungskoordinaten(Eye-Space) transformiert.</li>
 
<li>Normale werden nicht normalisiert bzw. reskaliert.</li>
 
<li>Normalisierung von evaluierten Normalen bei Nutzung von GL_AUTO_NORMAL wird nicht ausgeführt.</li>
 
<li>Texturkoordinaten werden nicht automatisch generiert.</li>
 
<li>Es wird keine per-Vertex Beleuchtung durchgeführt.</li>
 
<li>Farbmaterial-Berechnungen werden nicht durchgeführt.</li>
 
<li>Farbindex-Beleuchtung wird nicht durchgeführt.</li>
 
<li>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))</li>
 
<li>Die obere Liste gilt auch beim Setzen der Rasterposition.</li>
 
</ul>
 
  
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.
<ul>
+
*Die Projektionsmatrix wird nicht auf Vertexkoordinaten angewandt.
<li>Texturumgebung und Texturfunktionen werden nicht angewandt.</li>
+
*Die Texturenmatrix wird nicht auf Texturkoordinaten angewandt.
<li>Textur-Vergleichsmodi werden nicht angewandt.</li>
+
*Normale werden nicht in Betrachtungskoordinaten(Eye-Space) transformiert.
<li>Texturanwendung wird nicht berücksichtigt, ausser der Tatsache dass Textureinheiten aktiviert bzw. deaktiviert werden.</li>
+
*Normale werden nicht normalisiert bzw. reskaliert.
<li>Farbsumme wird nicht berechnet.</li>
+
*Normalisierung von evaluierten Normalen bei Nutzung von GL_AUTO_NORMAL wird nicht ausgeführt.
<li>Nebel wird nicht berechnet.</li>
+
*Texturkoordinaten werden nicht automatisch generiert.
</ul>
+
*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.
  
<br>
+
 
 +
 
 
== 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 '''glUseProgramObject''' aufgerufen wird.
+
Ä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.
 +
 
 +
 
  
<br>
 
 
== 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 '''glUseProgramObject''' zwischen einem [[glBegin]] und dem zugehörigen [[glEnd]] aufgerufen wird.
+
'''GL_INVALID_OPERATION''' wird generiert wenn '''glUseProgram''' zwischen einem [[glBegin]] und dem zugehörigen [[glEnd]] aufgerufen wird.
 +
 
 +
 
  
<br>
 
  
 
==  Zugehörige Wertrückgaben ==
 
==  Zugehörige Wertrückgaben ==
Zeile 80: Zeile 82:
 
[[glGetActiveAttrib]] mit dem Argument ''programObj''.  
 
[[glGetActiveAttrib]] mit dem Argument ''programObj''.  
  
<br>
+
 
 +
 
 +
 
 
== Siehe auch ==
 
== Siehe auch ==
[[glAttachObject]], [[glCompileShader]], [[glDetachObject]], [[glLinkProgram]], [[glValidateProgram]]<br>
+
[[glAttachShader]], [[glCompileShader]], [[glDetachShader]], [[glLinkProgram]], [[glValidateProgram]]
'''Hintergrundwissen''' : [[Shader]]<br>
+
 
 +
 
 +
'''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

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.)