web-dev-qa-db-fra.com

Créer un tableau GLSL d'uniformes?

Je voudrais laisser les lumières d'OpenGL et faire les miennes. J'aimerais que mes shaders autorisent un nombre variable de lumières.

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

62
Miles

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];

Vous pouvez ensuite définir leurs valeurs à l'aide de glUniform{1,2,3,4}{f,i}v

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

Oui, il est possible de déclarer un tableau d'uniformes dans les shaders GLSL. Juste google "glsl uniform array" pour quelques exemples (modifier: 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 anciennes, je ne suis pas sûr des actuelles (bien que j'imagine qu'il y en aurait toujours)).

Si vous décidez d'emprunter la voie des uniformes, je suggère d'utiliser des tampons d'uniformes. Selon http://www.opengl.org/wiki/Uniform_Buffer_Object , "La commutation entre les liaisons de 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
NickLH