Passage d'une variable à un shader OpenGL GLSL

J'écris une application iPhone qui utilise des shaders GLSL pour effectuer des transformations sur les textures, mais un point avec lequel j'ai un peu de mal est de passer des variables à mon shader GLSL.

J'ai lu qu'il est possible d'avoir un shader lu une partie de L'état OpenGL (et j'aurais seulement besoin d'un accès en lecture seule à cette variable), mais je ne suis pas sûr de savoir comment cet échange se produirait.

En bref, j'essaie d'obtenir une valeur float créée en dehors d'un shader de fragment pour être accessible à le shader fragment (qu'il soit transmis ou lu de l'intérieur du shader).

Merci pour toute aide/pointeurs que vous pouvez fournir, c'est très apprécié!

32
demandé sur Greg S 2010-07-12 11:29:59

1 réponses

Une option consiste à transmettre des informations via des variables uniformes.

Après

glUseProgram(myShaderProgram);

, Vous pouvez utiliser

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

Et par exemple

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

Dans votre VERTEX ou fragment shader, vous devez ajouter la déclaration suivante:

uniform float myUniform;

C'est tout, dans votre shader, vous pouvez maintenant accéder (en lecture seule) à la valeur que vous avez passée plus tôt via glUniform1f.

Bien sûr, les variables uniformes peuvent être n'importe quel type GLSL valide, y compris les types complexes tels que comme tableaux, structures ou matrice. OpenGL fournit une fonction glUniform avec les suffixes habituels, approprié pour chaque type. Par exemple, pour attribuer à une variable de type vec3, on utiliser glUniform3f ou glUniform3fv.

Note: la valeur ne peut pas être modifiée pendant l'exécution du shader, c'est-à-dire dans un glBegin/glEnd bloc. Il est en lecture seule et identique pour chaque fragment / sommet traité.

Il y a aussi plusieurs tutoriels utilisant des uniformes, vous pouvez les trouver en googlant"GLSL uniform variable".

J'espère que aider.

58
répondu Greg S 2013-06-28 19:35:45