2010-07-12 17 views
32

Ich schreibe eine iPhone-App, die GLSL-Shader verwendet, um Transformationen auf Texturen durchzuführen, aber ein Punkt, mit dem ich etwas Schwierigkeiten habe, ist die Übergabe von Variablen an meinen GLSL-Shader.Übergabe einer Variablen an einen OpenGL-GLSL-Shader

Ich habe gelesen, dass es möglich ist, einen Shader lesen Teil des OpenGL-Status (und ich würde nur Lesezugriff auf diese Variable benötigen), aber ich bin mir nicht sicher, wie dieser Austausch passieren würde.

Kurz gesagt, ich versuche, einen außerhalb des Fragment-Shaders erstellten Float-Wert für den Fragment-Shader verfügbar zu machen (unabhängig davon, ob er innerhalb des Shaders übergeben oder gelesen wird).

Danke für jede Hilfe/Zeiger, die Sie zur Verfügung stellen können, es ist sehr geschätzt!

Antwort

56

Eine Möglichkeit besteht darin, Informationen über einheitliche Variablen weiterzuleiten.

Nach

glUseProgram(myShaderProgram); 

Sie

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform"); 

und zum Beispiel

glUniform1f(myUniformLocation, /* some floating point value here */); 

In Ihrem Vertex oder Fragment-Shader verwenden können, müssen Sie die folgende Erklärung hinzuzufügen:

uniform float myUniform; 

Das ist es, in Ihrem Shader können Sie jetzt (schreibgeschützt) auf den Wert zugreifen, den Sie zuvor über glUniform1f übergeben haben.

Natürlich können einheitliche Variablen alle gültigen GLSL-Typen sein, einschließlich komplexer Typen wie als Arrays, Strukturen oder Matrizen. OpenGL bietet eine glUniform Funktion mit den üblichen Suffixen, passend für jeden Typ. Um beispielsweise einer Variablen vom Typ vec3 zuzuweisen, würde man glUniform3f oder glUniform3fv verwenden.

Hinweis: Der Wert kann während der Ausführung des Shaders nicht geändert werden, d. H. In einem glBegin/glEnd Block. Es ist schreibgeschützt und für jedes verarbeitete Fragment/Vertex gleich.

Es gibt auch mehrere Tutorials mit Uniformen, Sie können sie finden, indem Sie "Glsl Uniform Variable" googeln.

Ich hoffe, dass hilft.

+0

Greg, das hat perfekt funktioniert - danke! –

Verwandte Themen