39 votes

Passer une variable à un shader OpenGL GLSL

Je suis en train d'écrire une application pour iPhone qui utilise les shaders GLSL pour effectuer des transformations sur les textures, mais un point que j'ai un peu de mal à se passer des variables à mon shader GLSL.

J'ai lu que c'est possible d'avoir un shader de lire la 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 allait se passer.

Bref, je vais essayer d'obtenir un flotteur de création de valeur en dehors d'un fragment shader pour être accessible au fragment shader (si c'est passé ou lire à partir de l'intérieur du shader).

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

75voto

Greg S Points 6308

Une option est de transmettre des informations via uniforme variables.

Après

glUseProgram(myShaderProgram);

vous pouvez utiliser

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

et par exemple

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

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

uniform float myUniform;

C'est ça, dans votre shader, vous pouvez maintenant accéder (en lecture seule) la valeur que vous avez passé sur la via glUniform1f.

Bien sûr uniforme des variables peut être valable, toute GLSL type, y compris des types complexes tels que des tableaux, des structures ou des matrices. OpenGL fournit un glUniform fonction avec l'habitude, les suffixes,les appropriés pour chaque type. Par exemple, pour affecter à une variable de type vec3, on aurait utiliser glUniform3f ou glUniform3fv.

Remarque: la valeur ne peut pas être modifié pendant l'exécution du shader, c'est à dire en glBegin/glEnd bloc. Il est en lecture seule et la même pour chaque fragment/vertex traitées.

Il y a également plusieurs tutoriels à l'aide des uniformes, vous pouvez les trouver sur google "glsl uniforme variable".

J'espère que ça aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X