Question

J'utilise actuellement un VBO pour les coordonnées de texture, les normales et les sommets d'un modèle (3DS) dessiné avec "glDrawArrays (GL_TRIANGLES, ...);". Pour le débogage, je veux montrer (temporairement) les normales lors du dessin de mon modèle. Dois-je utiliser le mode immédiat pour dessiner chaque ligne de vert à vert + normal -OU- ajouter un autre VBO avec vert et vert + normal pour dessiner toutes les normales & # 8230; -OU- le vertex shader peut-il utiliser le vertex et les données normales déjà transmis lors du dessin du modèle pour calculer le V + N utilisé lors du dessin des normales?

Était-ce utile?

La solution

Non, il n'est pas possible de tracer des lignes supplémentaires à partir d'un vertex shader.

Un vertex shader ne consiste pas à créer une géométrie, mais à effectuer un calcul par sommet. En utilisant des vertex shaders, lorsque vous dites glDrawArrays (GL_TRIANGLES, 0,3) , c’est ce qui spécifie exactement ce que vous allez dessiner, c’est-à-dire 1 triangle. Une fois que le traitement atteint le vertex shader, vous pouvez uniquement modifier les propriétés des sommets de ce triangle , sans modifier de quelque manière que ce soit, la forme ou la forme, la topologie et / ou le nombre de géométries.

Ce que vous recherchez, c’est ce que OpenGL 3.2 définit comme un shader de géométrie , qui permet de générer un décompte / topologie de géométrie arbitraire à partir d’un shader. Notez cependant que ceci n’est supporté que par OpenGL 3.2, et que peu de cartes / pilotes ne le supportent à présent (il est sorti depuis quelques mois maintenant).

Cependant, je dois souligner que l'affichage des normales (dans la plupart des moteurs prenant en charge un certain type de débogage) est généralement effectué avec le rendu de ligne traditionnel, avec un tampon de vertex supplémentaire qui est rempli avec les positions appropriées (P, P +). C * N) pour chaque position du maillage, où C est une constante qui représente la longueur que vous souhaitez utiliser pour afficher les normales. Ce n'est pas si complexe à écrire ...

Autres conseils

Vous pouvez en faire une approximation en dessinant la géométrie deux fois. Une fois, dessinez comme vous le feriez normalement. La deuxième fois, dessinez la géométrie sous la forme GL_POINTS et associez un vertex shader qui décale chaque position de vertex de la normale au vertex.

Cela aurait pour effet que votre modèle dispose d'un ensemble de points flottant sur la surface. Chaque point indiquerait la direction de la normale à partir du sommet auquel il correspond.

Cela n’est pas parfait, mais cela pourrait être suffisant, selon le type de produit que vous souhaitez utiliser.

MISE À JOUR: AHA! Et si vous transmettez un facteur de mise à l'échelle constant au vertex shader et que votre application interpole ce facteur entre 0 et 1 au fil du temps, vos points rendus par le vertex shader s'animeront dans le temps, à partir du sommet auquel ils s'appliquent. puis flottant dans la direction de sa normale.

Il est probablement possible d'obtenir plus ou moins le bon effet avec un vertex shader intelligemment écrit, mais ce serait beaucoup de travail. Comme il s’agit de toute façon de débogage, il semble préférable de ne dessiner que quelques lignes; la performance ne sera pas sévère.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top