GLSL indexation uniforme tableau de longueur variable
Je suis de passage d'un réseau uniforme de la géométrie shader et souhaitez index dans l'aide d'une variable. Je peux utiliser la variable length array & index avec un nombre fixe (constante numérique) OU je peux définir une longueur fixe array & index à l'aide de varible. Cependant je ne peux pas l'indice de longueur variable tableau à l'aide d'une variable.
Ci-dessous est le pseudo-code pour la géométrie shader avec les cas que le travail & cas qui ne fonctionne pas
Cela fonctionne:
uniform vec2 dimensions[2];
//some code which computes index which is an int
float dimX = dimensions[index].x;
Cela fonctionne:
uniform vec2 dimensions[];
//some code which computes index which is an int
float dimX = dimensions[0].x;
Cela ne fonctionne pas:
uniform vec2 dimensions[];
//some code which computes index which is an int
float dimX = dimensions[index].x;
Est-il possible de faire quelque chose comme cela?
OriginalL'auteur Jitu | 2013-11-08
Vous devez vous connecter pour publier un commentaire.
Malheureusement, non, ce n'est pas possible. Vous n'avez pas à inclure le GLSL version que vous visez, mais ne mentionne geometry shaders, j'ai donc inclus à la partie pertinente de la GLSL 1.5 spec. ci-dessous:
GLSL cahier des charges (Version 1.5) - 4.1.9 Tableaux - pp. 25.
Tout bureau GLSL est beaucoup plus indulgent quand il s'agit de l'indexation des tableaux avec des non-const expressions que GLSL ES, vous avez encore à travailler à l'intérieur de certaines limites. De la même manière que la texture des recherches sont souvent utilisées pour surmonter les non-const tableau d'indexation dans OpenGL ES, vous pouvez peut-être contourner ce problème en utilisant une texture 1D de recherche dans votre geometry shader. Je me demande si vous avez vraiment besoin de cette fonctionnalité que mal si?
C'est une bonne idée de définir une limite supérieure à votre uniforme de la matrice de toute façon, parce que le GLSL spec. requiert seulement la mise en œuvre de 1024 uniforme des composants (par exemple 1024
float
, 256vec4
, 64mat4
ou d'une combinaison de chacun) dans la géométrie shader scène. Si votre groupe a connu une taille maximale au moment de la compilation, vous pouvez éviter des ennuis plus tard en bas de la route associée à son insu de dépasser cette limitation.Mise à JOUR:
Puisque vous avez mentionné GLSL 4.x, je tiens à souligner une nouvelle fonctionnalité dans OpenGL connu comme Shader De Mémoire De Stockage Des Objets. À l'aide de SSBOs, il peut être possible d'utiliser un tableau dynamique avec longueur au moment de l'exécution de vos objectifs. Vous pouvez interroger la longueur d'un SSBO à l'aide de
.length ()
dans le shader, et la poignée de la plage de la validation de vous-même. Cependant, je pense que c'est probablement excessif, mais vaut la peine de mentionner néanmoins.Cela s'applique à GLSL 4.x ainsi, la raison pour laquelle vous ne pouvez pas l'indice d'un tableau avec une inconnue de taille à l'aide d'un non-const expression est parce qu'il n'y a aucun moyen de vérifier les limites du tableau / exigences de taille au moment de la compilation dans une telle situation. Une solution possible puisque vous avez mentionné GLSL 4.x est quelque chose qui s'appelle Shader Blocs de Stockage (SSBO), ils peuvent ont pas défini la longueur.. les textures sont plus portable moyen d'accomplir cela, mais SSBOs sont certainement l'avenir.
J'ai accidentellement appuyé sur enter, avant de terminer ma réponse. Nombre d'éléments des dimensions de la matrice est toujours va être de moins de 20 ans, cependant, j'ai été curieux de savoir pourquoi ça ne fonctionne pas (maintenant que vous avez indiqué pour les specs, je sais pas pourquoi). Donc je suppose que je peux me contenter de déclarer qu'il soit de taille 20, limite supérieure dans mon cas. Je voudrais vérifier encore une chose, si je déclare mon uniforme pour être de taille 20, cependant, dans le code C++ je remplir seulement 5 éléments dans la mémoire tampon, seulement l'espace pour les 5 éléments (et non 20) est allouée à droite? Aussi, je voulais éviter 1D texture, car son plus lent que les uniformes. Merci, Jitu
Non, en fait, elle a pour réserver suffisamment d'espace de stockage pour chaque élément d'un réseau uniforme déclaré
vec2 dimensions [20];
. Mais étant donné que chaque GLSL programme vous donne déjà assez de stockage pour au moins 1024 composants comme je l'ai mentionné dans la réponse, vous devriez être fine (1024-40=984). Des Textures et des vertex buffers besoin beaucoup plus d'espace de stockage que les uniformes ne le sera jamais 🙂Grâce Andon c'est utile de savoir..
OriginalL'auteur Andon M. Coleman