2010-07-12 15 views
32

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.Pasando una variable a un sombreador OpenGL GLSL

He leído que es posible hacer que un sombreador lea parte del estado de OpenGL (y solo necesitaría acceso de solo lectura a esta variable), pero no estoy seguro de cómo ocurrirá 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/información que pueda proporcionar, ¡es muy apreciada!

Respuesta

56

Una opción es pasar información mediante variables uniformes.

Después

glUseProgram(myShaderProgram); 

puede utilizar

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

y, por ejemplo

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

En su vértice o fragment shader, es necesario agregar la siguiente declaración:

uniform float myUniform; 

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

Por supuesto, las variables uniformes pueden ser cualquier tipo válido de GLSL, incluidos los tipos complejos tales como 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, se usaría use glUniform3f o glUniform3fv.

Nota: el valor no se puede modificar durante la ejecución del sombreado, 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 ayude.

+0

Greg, esto funcionó perfectamente, ¡gracias! –

Cuestiones relacionadas