iphone opengl-es glsl

iphone - Pasar una variable a un sombreador OpenGL GLSL



opengl-es (1)

Estoy escribiendo una aplicación para iPhone que usa sombreadores GLSL para realizar transformaciones en texturas, pero un punto que me resulta un poco difícil es pasar variables a mi sombreador GLSL.

He leído que es posible hacer que un sombreador lea parte del estado de OpenGL (y que solo necesitaría acceso de solo lectura a esta variable), pero no estoy seguro de cómo sucederá ese intercambio.

En resumen, estoy tratando de hacer que un valor flotante creado fuera de un sombreador de fragmentos sea accesible para el sombreador de fragmentos (ya sea que se transfiera o se lea desde el sombreador).

Gracias por cualquier ayuda / indicaciones que pueda proporcionar, ¡es muy apreciado!


Una opción es pasar información a través de variables uniformes.

Después

glUseProgram(myShaderProgram);

puedes usar

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

y por ejemplo

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

En su sombreador de vértices o fragmentos, debe agregar la siguiente declaración:

uniform float myUniform;

Eso es todo, en su sombreador ahora puede acceder (solo lectura) al valor que aprobó anteriormente mediante glUniform1f .

Por supuesto, las variables uniformes pueden ser cualquier tipo válido de GLSL, incluidos los tipos complejos como matrices, estructuras o matrices. OpenGL proporciona una función glUniform con los sufijos habituales, apropiados para cada tipo. Por ejemplo, para asignar a una variable de tipo vec3 , uno usaría glUniform3f o glUniform3fv .

Nota: el valor no se puede modificar durante la ejecución del sombreador, es decir, en un bloque glBegin / glEnd . Es de solo lectura y lo mismo para cada fragmento / vértice procesado.

También hay varios tutoriales que usan uniformes, puedes encontrarlos buscando en Google "variable uniforme de GLSL".

Espero que eso ayude.