GLSL / C ++: tableaux d’uniformes?

Je voudrais laisser les lumières d’OpenGL et faire les miennes. Je voudrais que mes shaders permettent un nombre variable de lumières.

Peut-on déclarer un tableau d’uniformes dans les shaders GLSL? Si oui, comment définirions-nous les valeurs de ces uniformes?

Oui c’est possible. Vous déclarez des tableaux uniformes comme vous le feriez dans C, par exemple

uniform float v[10]; 

Ensuite, vous pouvez définir leurs valeurs en utilisant glUniform{1,2,3,4}{f,i}v

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

Oui, il est possible de déclarer un tableau d’uniformes dans les shaders GLSL. Il suffit de google “tableau uniforme glsl” pour quelques exemples (edit: ou voir l’exemple de datenwolf). Il y a cependant des limitations sur le nombre d’uniformes pouvant être envoyés à différentes cartes graphiques (du moins sur les anciennes, je ne suis pas sûr des actuelles (bien que j’imagine qu’il y en aurait encore)).

Si vous décidez de suivre la voie des uniformes, je vous suggère d’utiliser des tampons uniformes. Selon http://www.opengl.org/wiki/Uniform_Buffer_Object , “basculer entre des liaisons de tampon uniformes est généralement plus rapide que de changer des dizaines d’uniformes dans un programme”.

Si vous avez un grand nombre de lumières et de parameters, vous pouvez également envoyer les données sous forme de tampons flottants.