2


1

Structures GLSL "in"

Je ne suis pas autorisé à utiliser une structure avec le mot clé in, n’est-ce pas? Par exemple:

struct Rect {
    float x,y,width,height;
};

layout(location = 7) in Rect TexSrc;

C’est difficile pour Google, mais j’obtiens une erreur lorsque j’essaie d’utiliser mon shader GLSL (INVALID_OPERATION). Il semble cependant que je puisse utiliser float [4].

Si je ne suis pas autorisé à utiliser une structure, que proposez-vous que je fasse? Construire la structure à partir d’un float [4], ou le sucer, renoncer à la belle API et utiliser les indices 0-3 partout?

(Un vec4 fonctionnerait ici aussi, je sais, mais` z` et w n’ont pas tout à fait la même signification que" largeur "et" hauteur ", et ce n’est qu’un exemple)

Je suppose que vous ne pouvez spécifier qu’un seul type par emplacement avec glVertexAttribPointer, donc je peux voir pourquoi une structure serait interdite …​ J’essaie juste de penser à un moyen de garder mon code propre et transparent sans compromettre les performances.

1 Answer


3


Vous ne pouvez pas avoir d’entrées de vertex shader de `struct`s.

La bonne façon de le faire est de simplement les coller dans un vec4. Si vous utilisez un float [4], cela nécessitera quatre attributs au lieu d’un seul. Les tableaux prennent toujours un attribut par élément. Donc, si vous faites layout (location = 7) dans float [4] TexSrc;, cela prendra les indices d’attribut 7, 8, 9 et 10. C’est un énorme gaspillage d’attributs et cela pourrait dégrader les performances.

Utilisez simplement un vec4 comme tout le monde. Les gens emballent des entrées dans `vec4`s tout le temps; ils utilisent des commentaires pour expliquer toute bizarrerie sémantique.

BTW, si vous obtenez une opération non valide, cela signifie probablement que vous n’avez pas réellement vérifié si votre shader a été compilé et lié correctement. Vous devriez toujours le faire.

Du nouveau

OpenGL 4.4 ou l’extension ARB_enhanced_layouts, vous permettent de faire quelque chose comme ça.

Comme indiqué précédemment, le principal problème avec layout (location = 7) dans float [4] TexSrc; est qu’il occupe 4 emplacements d’entrée. Donc, si vous avez 4 flotteurs qui ne sont pas vraiment un vecteur 4D, vous devez toujours les emballer dans un vec4 pour les envoyer dans le shader:

layout(location = 7) in vec4 rect;

Cela rend beaucoup plus difficile de savoir ce que signifie «rect.z» dans le shader, car il n’a aucune signification explicite.

4.4 / Enhanced_layouts vous permet de packer plusieurs variables dans un seul emplacement, tant que leurs composants ne se chevauchent pas. Donc, si chaque emplacement est conceptuellement un vec4, nous pouvons le diviser en 2` vec2`s:

layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;

Maintenant, nous obtenons des informations sémantiques. rectPos est la position du rectangle, tandis que` rectSize` est sa taille. Et il ne prend toujours qu’un seul emplacement.

La fonction de mise en page améliorée permet à cela de fonctionner pour toutes les entrées et sorties _, pas seulement pour les vertex shaders.