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.

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

57
demandé sur Miles 2011-11-12 01:06:05

2 réponses

Oui c'est possible. Vous déclarez des tableaux uniformes similaires à la façon dont vous le feriez en 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);
73
répondu datenwolf 2011-11-11 21:34:04

Oui, il est possible de déclarer un tableau d'uniformes dans les shaders GLSL. Juste google "GLSL uniform array" pour quelques exemples (edit: ou voir l'exemple de datenwolf). Il y a cependant des limites sur le nombre d'uniformes pouvant être envoyés à différentes cartes graphiques (au moins sur les plus anciennes, Je ne suis pas sûr des uniformes actuels (bien que j'imagine qu'il y en aurait encore)).

Si vous décidez de suivre la route des uniformes, je suggère d'utiliser des tampons uniformes. Selon http://www.opengl.org/wiki/Uniform_Buffer_Object , "la commutation entre les liaisons tampons uniformes est généralement plus rapide que la commutation de dizaines d'uniformes dans un programme".

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

6
répondu NickLH 2011-11-11 21:35:54