Qu'est-ce qu'une couleur de sommet?

31

Ma question est ce qui est écrit dans le titre. Ce terme "couleur de sommet" apparaît beaucoup. J'ai du mal à comprendre cela.

Par exemple:

Un point simple sommet n'est-il pas sur l'espace 3D? Si oui, comment un point peut-il avoir une couleur? Ou cette "couleur" signifie-t-elle autre chose?

Il y a un nœud "Vertex Color" dans l'éditeur de matériaux du moteur irréel.

Quelqu'un peut-il éclairer ma question? Je n'ai rien trouvé d'utile quand j'ai googlé "qu'est-ce qu'une couleur vertex" mais des documentations trop techniques pour moi.

Bora
la source
2
En géométrie, un sommet n'est qu'un point dans l'espace. Mais pour le rendu 3D, vous voulez que les choses soient belles, ce qui peut signifier attacher plus d'informations à chaque sommet, comme une couleur ou une coordonnée de texture, ou des poids squelettiques afin que vous puissiez animer le maillage plus facilement, ou une direction normale à utiliser dans l'éclairage calculs.
user253751
3
Je pense qu'une grande partie de votre confusion est due à la fréquente combinaison des termes «sommet» et «position» en 3D / graphiques. Mathématiquement, votre affirmation «N'est-ce pas un point simple de sommet sur l'espace 3D?» Est correcte, mais dans le domaine des moteurs de jeu et des graphiques, non, une position est un simple point dans l'espace 3D; et un sommet (maillé) est un élément de données qui a presque toujours une position, mais peut également avoir une coordonnée de texture, une couleur, et / ou l'un quelconque de nombreux autres éléments de données normaux, tangents . Un sommet de maillage n'est en réalité qu'un bloc de données qui est traité à l'étape du sommet du rendu.
Slipp D. Thompson

Réponses:

29

Les couleurs de sommet ne sont pas si pertinentes lorsque vous avez un maillage 3D entièrement texturé. Mais cela devient intéressant lorsque vous avez un maillage non texturé mais coloré. Dans ce cas, vous attribuez une couleur à chaque sommet. Le shader colorierait alors chaque pixel d'un polygone en interpolant entre les couleurs des trois sommets.

Les couleurs des sommets peuvent aussi parfois être intéressantes en combinaison avec des textures. Lorsque vous souhaitez utiliser un algorithme d'ombrage comme Gouraud Shading , vous calculez simplement l'intensité lumineuse sur chaque sommet, attribuez la couleur de la lumière au sommet comme couleur de sommet, et lorsque vous rendez la texture, vous multipliez la valeur de couleur de chaque pixel de texture avec les couleurs interpolées. Cela vous permet de calculer les sources de lumière dans le vertex shader au lieu du pixel shader. Ceci est généralement beaucoup plus rapide, car le vertex shader est généralement exécuté beaucoup moins fréquemment.

Philipp
la source
2
btw, la couleur des sommets était utilisée dans certains jeux plus anciens qui n'avaient pas d'éclair / d'ombres dynamiques. Par exemple, Richard Burns Rally de 2004 utilise la couleur des sommets pour créer différentes textures et appliquer des ombres.
martin
The Witness est un jeu récent qui utilise largement les couleurs des sommets et les lightmaps, mais pas beaucoup de textures.
user253751
@Philipp "car le vertex shader est généralement exécuté beaucoup moins fréquemment" Pourquoi? Le vertex shader ne fait-il pas partie du pipeline de rendu et donc exécuté chaque image? Pourquoi moins souvent? La "couleur" du sommet ne devrait-elle pas être calculée également à chaque image, comme si elle était dans le pixel shader?
Nikos
1
@Nikos Un vertex shader est appelé une fois par vertex. Un pixel shader est ensuite appelé une fois par pixel. Un polygone avec 3 sommets donne généralement plus de 3 pixels à l'écran (si votre jeu finit par calculer beaucoup de polygones qui couvrent moins de 3 pixels, vous voudrez peut-être examiner ce que vous pouvez faire en ce qui concerne l'abattage et le niveau de détail).
Philipp
25

En théorie, Vertex Color permet de colorer un modèle sans avoir à se soucier des textures. Ceci est assez courant en CAD.

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

En pratique, c'est juste un emplacement supplémentaire que vous pouvez utiliser pour pousser des données dans le sommet, que vous utilisez ensuite dans le vertex shader pour faire des trucs fous .

"N'est-ce pas un point simple sommet sur l'espace 3D?"

C'est ce que je pensais, lorsque j'ai commencé avec la 3D. J'ai vite compris que j'avais tort .

Vous pouvez considérer un sommet comme un blob de données qui constitue un coin d'un triangle que vous souhaitez peindre à l'écran (et ni la partie "coin" ni les parties "triangle", "peinture" ou "écran" ne sont toujours vraies) ). La position est un aspect optionnel de ce blob de données que nous appelons Vertex.

Vous pouvez faire beaucoup en attachant des données supplémentaires au sommet. L'exemple le plus célèbre est que vous pouvez ajouter des coordonnées uv pour dessiner une texture sur ce triangle. Vous (généralement) ne pouvez pas décider quelle partie d'une texture dessiner sur le triangle si vous n'avez qu'un point - vous avez également besoin de coordonnées de texture.

D'autres exemples standard de ce qui se trouve dans ce blob sont les normales et les tangentes. Ce qui est important, c'est que tous sont facultatifs, y compris le poste. Vertex Color n'est qu'une de ces entrées optionnelles que vous pouvez utiliser ou abuser pour créer une jolie image à l'écran.

Peter
la source
2
".. comme un blob de données qui constitue un bord d'un triangle" même si ce n'est pas nécessairement. Les sommets peuvent être rendus comme des points très bien.
Kromster dit soutenir Monica
3
Pour quelques excellents exemples des effets de shader que vous pouvez obtenir en utilisant les couleurs des sommets, je vous recommande fortement de consulter la conférence GDC de Natalie Burke de l'année dernière, "Animating With Math" (la vidéo est réservée aux membres pour le moment, mais les diapositives sont gratuites ici ) . Elle montre combien d'animations dans l'équipement de Destiny, les cheveux et le tissu des personnages, et même des parties de leurs ennemis et de leur environnement ont été réalisées à l'aide de vertex shaders, façonnés et contrôlés avec des canaux de couleur de vertex.
DMGregory
5
Je dirais que ce ne sont pas des couleurs de sommet, mais des attributs de sommet représentés comme des couleurs pour une perception plus facile.
Kromster dit soutenir Monica
Il y a des utilisations tout aussi inventives des vertex shaders dans cette discussion sur FortNite , bien que si je me souviens bien, je pense qu'ils ont principalement utilisé les canaux UV des sommets plutôt que les canaux de couleur.
DMGregory
3
À proprement parler, d'un point de vue basé sur la géométrie / les mathématiques, un sommet n'est qu'un point dans l'espace. La «couleur du sommet» est un attribut appliqué au sommet par «l'idée» d'un sommet utilisé par les GPU. C'est la même chose qu'un cercle ayant une couleur ou non. L '«idée» géométrique / mathématique d'un cercle n'a pas de couleur mais «l'idée» du logiciel de rendu d'un cercle associe une couleur au cercle. Ainsi l'argument de @ Kromster est plus techniquement correct.
Pharap
8

Les sommets peuvent avoir des couleurs, c'est une propriété tout comme la normale.

Dans les environnements 3D, un triangle est coloré en fonction des informations de couleur de ses sommets. Les fragments les plus proches du sommet A en obtiennent la couleur, les plus proches du sommet B obtiennent le col de B, et la couleur interpole entre les 2.

Il fonctionne de la même manière que l'éclairage par sommet

C'est un moyen simple d'ajouter des couleurs à un modèle sans utiliser de texture.

Bálint
la source
+1 pour avoir donné un exemple (espérons-le) familier d'un autre attribut de sommet similaire
AC
Le problème avec les couleurs et les normales des sommets est qu'ils supposent que le sommet fait partie d'un maillage (une approximation d'une surface courbe). Si vous voulez des arêtes vives ou des faces de couleurs différentes (comme sur un cube), vous avez besoin de sommets séparés pour chaque face, ce qui augmente considérablement l'utilisation de la mémoire (et ralentit le rendu).
amI
@aml Vous pouvez utiliser l'opérateur "flat" dans glsl pour produire un ombrage plat. Ce n'est pas tout à fait pareil, mais ça marche.
Bálint
autre attribut interpolé: coordonnée de texture et tampon z! nous avons le vertex shader qui calcule des données pour chacun des 3 sommets du triangle, celles-ci sont interpolées lors du dessin du triangle sur l'écran (ou dans un tampon), et le pixel shader est appelé avec la valeur interpolée pour chaque pixel dessiné
user1952009
@aml Bien sûr, x2 n'est pas un goulot d'étranglement. Et les shaders de géométrie sont faits pour ça, je dirais (par exemple: transformer une texture de profondeur en triangles )
user1952009
2

Il y a déjà des réponses solides ici - je veux juste faire un carillon avec une autre façon courante de voir les couleurs de vertex utilisées:

Varier les couleurs des objets (ou d'autres attributs) dans un même appel par lots / tirages.

Vous verrez cela utilisé dans le rendu des systèmes de particules, du texte et des sprites groupés (généralement classés).

Imaginez que vous ayez un émetteur de particules qui génère des particules avec une couleur de départ aléatoire, ou qui s'estompe à 0 alpha pendant la durée de vie des particules. Si nous devions utiliser des uniformes de shader pour envoyer ces données de couleur, nous aurions besoin de dessiner chaque particule de couleur différente dans son propre appel de dessin, ce qui rend le système de particules beaucoup plus cher. Au lieu de cela, nous pouvons faire cuire ces couleurs dans les données de sommet pour les particules et rendre l'ensemble du lot en un seul appel.

Unity semble utiliser cette technique pour la variation de couleur des particules, ainsi que pour colorer des caractères individuels dans un TextMesh ou des Sprites rendus ensemble dans un lot.

Je crois que vous pouvez faire quelque chose de similaire avec l'instanciation de la géométrie, mais je ne sais pas comment les deux se comparent en termes de performances. Il est possible qu'aujourd'hui, ce type de modification instanciée des couleurs des sommets soit plus un maintien pour prendre en charge le matériel pré-OpenGL 3.1 / DX9 comme certains appareils mobiles, plutôt qu'une meilleure pratique pour les PC modernes. Je serais heureux de recevoir les commentaires de personnes qui ont effectué plus de réglages de performances avec des lots et des instanciations pour aider à déterminer si ces techniques ont remplacé les couleurs de vertex à cette fin. :)

DMGregory
la source