2011-11-11 16 views
57

Me gustaría dejar las luces de OpenGL y hacer las mías. Me gustaría que mis shaders permitieran un número variable de luces.GLSL/C++: matrices de uniformes?

¿Podemos declarar una serie de uniformes en los sombreadores GLSL? En caso afirmativo, ¿cómo estableceríamos los valores de esos uniformes?

+4

Cualquier persona que quiera un número variable de luces, solo haga arreglos con capacidades decentes, y mantenga un conteo de la cantidad de luces actualmente activas. GLSL no permite matrices de tamaño variable (todos los tamaños de matriz deben ser valores constantes y codificados). – Miles

Respuesta

71

Sí, esto es posible. Declaras matrices uniformes de forma similar a como lo harías en C, p. Ej.

uniform float v[10]; 

continuación, puede configurar sus valores usando glUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...}; 
glUniform1fv(glGetUniformLocation(program, "v"), 10, v); 
+2

¿a qué se refieren los 1, 2, 3 y 4? ¿Eso significa que solo puedo establecer los valores de una matriz de hasta cuatro miembros? – Miles

+0

Es un uso muy inteligente/retorcido de 'glUniform1fv'. Uno pensaría que el segundo parámetro de 'glUniform1fv' es solo una formalidad y que debería usarse siempre como un 1. – bobobobo

+0

Así que técnicamente podría establecer un' vec4' uniforme usando 'glUniform1fv (uniformId, 4, v);' donde 'v' es una matriz de 4 carrozas. – bobobobo

7

Sí es posible declarar una matriz de uniformes en shaders GLSL. Simplemente google "array uniforme glsl" para algunos ejemplos (editar: o ver ejemplo de datenwolf). Sin embargo, hay limitaciones en cuanto a la cantidad de uniformes que se pueden enviar a diferentes tarjetas gráficas (al menos en las anteriores, no estoy seguro de cuáles son las actuales (aunque me imagino que aún las habría)).

Si decides ir por la ruta de los uniformes, te sugiero que uses tampones uniformes. De acuerdo con http://www.opengl.org/wiki/Uniform_Buffer_Object, "Cambiar entre enlaces de buffer uniformes es típicamente más rápido que cambiar docenas de uniformes en un programa".

Si tiene un gran número de luces y parámetros, también puede enviar los datos como búferes flotantes.

+6

Los objetos de memoria intermedia uniforme solo están disponibles desde GL versión 3.1. La extensión ARB_Uniform_Buffer_Object es necesaria desde la versión 2.0. –

+54

Googleing "conjunto uniforme glsl" ahora devuelve esta página como el primer resultado !! ¿Que hacemos ahora? – mlvljr

+1

Puede consultar OpenGL en tiempo de ejecución para obtener el número máximo de uniformes con 'resultado de Glint; glGetIntegerv (GL_MAX_UNIFORM_LOCATIONS, 0, & result); ' – rwols

Cuestiones relacionadas