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é!
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.