79 votes

GLSL / C ++: Tableaux d'uniformes?

J'aimerais laisser les lumières d'OpenGL et créer les miennes. J'aimerais que mes shaders autorisent un nombre variable de lumières.

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

103voto

datenwolf Points 85093

Oui c'est possible. Vous déclarez des tableaux uniformes similaires à ceux que vous utiliseriez 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);
 

7voto

NickLH Points 1845

Oui, il est possible de déclarer un tableau de l'uniforme dans shaders GLSL. Juste google "glsl réseau uniforme" pour quelques exemples (edit: ou voir datenwolf exemple). Il y a toutefois des limites sur combien d'uniformes peuvent être envoyées à différentes cartes graphiques (au moins sur les anciennes, je ne suis pas sûr actuels (bien que j'imagine qu'il serait quand même)).

Si vous décidez d'aller en bas de la route de l'uniforme, je dirais uniforme à l'aide de tampons. Selon http://www.opengl.org/wiki/Uniform_Buffer_Object, "Commutation entre les uniformes de la mémoire tampon liaisons est généralement plus rapide que de passer des dizaines d'uniformes dans un programme".

Si vous avez un grand nombre de feux et les paramètres, vous pouvez également envoyer les données en tant que float tampons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X