Hélas, j'ai cherché et je n'ai trouvé aucune réponse définitive.
Quand souhaitez-vous normaliser les données de sommet dans OpenGL en utilisant la commande suivante:
glVertexAttribPointer(index, size, type, normalize, stride, pointer);
C'est-à-dire quand le ferait normalize == GL_TRUE
; quelles situations, et pourquoi choisiriez-vous de laisser le GPU faire les calculs au lieu de le prétraiter? Tous les exemples que j'ai jamais vus, ont cet ensemble à GL_FALSE; et je ne peux pas personnellement voir une utilisation pour cela. Mais Khronos n'est pas stupide, donc il doit être là pour quelque chose d'utile (et probablement commun).
C'est une vieille question, mais la réponse actuelle n'explique pas vraiment à quoi vous les utiliseriez.
Il s'agit de gagner de l'espace. Et avec les attributs de sommet, moins d'espace peut signifier des performances plus élevées (si vous êtes lié au transfert de sommet).
Les couleurs n'ont généralement pas besoin de plus de 8 bits par composant. Parfois, vous avez besoin de 16 bits, si c'est une valeur lumineuse HDR ou quelque chose. Mais pour les caractéristiques de surface (ce qui est le cas de la plupart des attributs de sommet), 8 bits conviennent. Les octets normalisés non signés sont donc un bon format de sommet.
Les coordonnées de texture n'ont pas besoin de 32 bits de précision en virgule flottante. Une valeur de 16 bits de [0, 1] est suffisante. Les shorts non signés normalisés sont donc un format de sommet raisonnable.
Les normales n'ont jamais besoin d'une précision de 32 bits. Ce sont des directions. Les octets normalisés signés 8 bits ont tendance à être un peu petits, mais les valeurs normalisées 10 bits sont suffisantes la plupart du temps. OpenGL (3.3+) vous permet même d'utiliser des normales 10 bits via un format compressé 10/10/10/2 bits, stocké dans un seul entier non signé 32 bits.
Vous pouvez même jouer à des jeux avec des positions de vertex, si vous vous trouvez dans le besoin urgent de plus de mémoire.
Sans normalisation, vous devrez gaspiller de précieux cycles dans votre shader en divisant les attributs en octets par 255,0. Pourquoi faire cela, alors que le matériel peut le faire gratuitement?
la source
Imaginez que vous ayez un maillage avec des normales de haute précision et un autre maillage avec des basses. Avec la normalisation d'attribut, vous pouvez utiliser le même shader mais empaqueter les normales du deuxième maillage en octets.
la source