¿Qué es un color de vértice?

31

Mi pregunta es qué está escrito en el título. Este término "color de vértice" aparece mucho. Estoy teniendo dificultades para entender esto.

Por ejemplo:

¿No es un punto de vértice simple en el espacio 3D? Si es así, ¿cómo puede un punto tener un color? ¿O este "color" significa algo más?

Hay un nodo "Vertex Color" en el editor de materiales del motor irreal.

¿Alguien puede arrojar luz sobre mi pregunta? No pude encontrar nada útil cuando busqué en Google "qué es un color de vértice", pero las documentaciones son demasiado técnicas para mí.

Bora
fuente
2
En geometría, un vértice es solo un punto en el espacio. Pero para el renderizado 3D desea que las cosas se vean bien, lo que podría significar adjuntar más información a cada vértice, como un color, una coordenada de textura o pesos esqueléticos para que pueda animar la malla más fácilmente o una dirección normal para usar en la iluminación cálculos
user253751
3
Creo que gran parte de su confusión se debe a la frecuente combinación de los términos "vértice" y "posición" en 3D / gráficos. Matemáticamente, su afirmación "¿No es un punto de vértice simple en el espacio 3D?" Es correcta, pero en el ámbito de los motores de juego y gráficos, no, una posición es un punto simple en el espacio 3D; y un vértice (malla) es un dato que casi siempre tiene una posición, pero también puede tener una coordenada normal, tangente, de textura, color y / o cualquiera de los muchos otros datos . Un vértice de malla es realmente solo una porción de datos que se procesan en la etapa de vértice de la representación.
Slipp D. Thompson

Respuestas:

29

Los colores de vértice no son tan relevantes cuando tienes una malla 3D completamente texturizada. Pero se pone interesante cuando tienes una malla sin textura pero de color. En ese caso, asigna un color a cada vértice. El sombreador entonces colorea cada píxel de un polígono interpolando entre los colores de los tres vértices.

Los colores de vértices también pueden ser interesantes en combinación con texturas. Cuando desee utilizar un algoritmo de sombreado como Gouraud Shading , simplemente calcule la intensidad de la luz en cada vértice, asigne el color de la luz al vértice como un color de vértice, y cuando renderice la textura, multiplique el valor de color de cada píxel de textura con Los colores interpolados. Esto le permite calcular las fuentes de luz en el sombreador de vértices en lugar del sombreador de píxeles. Esto suele ser mucho más rápido, porque el sombreador de vértices generalmente se ejecuta con mucha menos frecuencia.

Philipp
fuente
2
por cierto, el color del vértice se usó en algunos juegos más antiguos que no tenían sombras / rayos dinámicos. Por ejemplo, Richard Burns Rally de 2004 está utilizando el color del vértice para crear texturas de aspecto diferente y aplicar sombras.
Martin
The Witness es un juego reciente que hace un uso extensivo de colores de vértices y mapas de luz, pero no muchas texturas.
user253751
@Philipp "porque el sombreador de vértices generalmente se ejecuta con mucha menos frecuencia" ¿Por qué? ¿No es el sombreador de vértices parte de la tubería de renderizado y, por lo tanto, ejecutó cada cuadro? ¿Por qué con menos frecuencia? ¿No debería calcularse también el "color" del vértice en cada cuadro, como si estuviera en el sombreador de píxeles?
Nikos
1
@Nikos Un sombreador de vértices se llama una vez por vértice. Luego se llama un sombreador de píxeles una vez por píxel. Un polígono con 3 vértices generalmente da como resultado más de 3 píxeles en pantalla (si su juego termina calculando muchos polígonos que cubren menos de 3 píxeles, es posible que desee ver qué puede hacer con respecto al sacrificio y LOD).
Philipp
25

En teoría, Vertex Color permite colorear un modelo sin tener que preocuparse por las texturas. Esto es bastante común en CAD.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

En la práctica, es solo una ranura más que puede usar para insertar datos en el vértice, que luego usa en el sombreador de vértices para hacer cosas locas .

"¿No es un punto de vértice simple en el espacio 3D?"

Eso era lo que solía pensar cuando comencé con 3D. Aprendí rápidamente que estaba equivocado .

Puede pensar en un vértice como un blob de datos que forma una esquina de un triángulo que desea pintar en la pantalla (y ni la parte "esquina" ni las partes "triángulo", "pintura" o "pantalla" son siempre verdaderas ) La posición es un aspecto opcional de ese blob de datos que llamamos Vértice.

Hay muchas cosas que puede hacer adjuntando datos adicionales al vértice. El ejemplo más famoso es que puede agregar coordenadas uv para dibujar una textura en ese triángulo. Usted (generalmente) no puede decidir qué parte de una textura dibujar en el triángulo si solo tiene un punto; también necesita coordenadas de textura.

Otros ejemplos estándar de lo que hay en esa burbuja son normales y tangentes. Lo importante es que todos son opcionales, incluida la posición. Vertex Color es solo una de estas entradas opcionales que puede usar o abusar para crear una imagen bonita en la pantalla.

Peter
fuente
2
"... como un blob de datos que forma el borde de un triángulo", incluso eso no es necesariamente. Los vértices se pueden representar como puntos muy bien.
Kromster dice que apoya a Mónica el
3
Para obtener algunos ejemplos excelentes de los efectos de sombreado que puede lograr con los colores de vértice, le recomiendo que consulte la charla de GDC de Natalie Burke del año pasado, "Animating With Math" (el video es solo para miembros en este momento, pero las diapositivas son gratis aquí ) . Ella muestra cuántas de las animaciones en el equipo de Destiny, el cabello y la tela del personaje, e incluso partes de sus enemigos y entornos se lograron usando sombreadores de vértices, formados y controlados con canales de color de vértices.
DMGregory
55
Yo diría que esos no eran colores de vértice, sino atributos de vértice mostrados como colores para una percepción más fácil.
Kromster dice que apoya a Mónica el
Hay algunos usos igualmente ingeniosos de los sombreadores de vértices en esta charla sobre FortNite , aunque si recuerdo bien, creo que utilizaron principalmente los canales UV de los vértices en lugar de los canales de color.
DMGregory
3
Hablando estrictamente desde un punto de vista basado en geometría / matemáticas, un vértice es solo un punto en el espacio. El 'color del vértice' es un atributo aplicado al vértice por la 'idea' de un vértice utilizado por las GPU. Es lo mismo que un círculo que tiene un color o no. La "idea" geométrica / matemática de un círculo no tiene un color, pero la "idea" del software de representación de un círculo asocia un color al círculo. Por lo tanto, el argumento de @ Kromster es más técnicamente correcto.
Pharap
8

Los vértices pueden tener colores, es una propiedad como la normal.

En entornos 3D, un triángulo se colorea según la información de color de sus vértices. Los fragmentos más cercanos al vértice A obtienen el color, el más cercano al vértice B obtiene el color de B y el color se interpola entre los 2.

Funciona de la misma manera que la iluminación por vértice.

Es una manera fácil de agregar colores a un modelo sin usar una textura.

Bálint
fuente
+1 por dar un ejemplo (con suerte) familiar de otro atributo de vértice similar
AC
El problema con los colores y las normales de los vértices es que suponen que el vértice es parte de una malla (una aproximación de una superficie curva). Si desea bordes afilados o caras de diferentes colores (como en un cubo), necesita vértices separados para cada cara, lo que aumenta en gran medida el uso de memoria (y ralentiza el renderizado).
amI
@aml Puede usar el "operador" plano en glsl para generar que el sombreado se vea plano. No es completamente igual, pero funciona.
Bálint
otro atributo interpolado: coordenada de textura y z-buffer! tenemos el sombreador de vértices que calcula algunos datos para cada uno de los 3 vértices del triángulo, esos se interpolan al dibujar el triángulo en la pantalla (o en algún búfer), y el sombreador de píxeles se llama con el valor interpolado para cada píxel dibujado
user1952009
@aml Por supuesto, x2 no es un cuello de botella. Y los sombreadores de geometría están hechos para eso, yo diría (por ejemplo: transformar una textura de profundidad en triángulos )
user1952009
2

Aquí ya hay respuestas sólidas: solo quiero intervenir con una forma más común de ver los colores de vértice utilizados:

Diversos colores de objeto (u otros atributos) dentro de una sola llamada de lote / extracción

Verá esto utilizado en la representación de sistemas de partículas, texto y sprites en lotes (generalmente atlased).

Imagine que tiene un emisor de partículas que genera partículas con un color de inicio aleatorio, o que se desvanecen a 0 alfa durante la vida útil de las partículas. Si tuviéramos que usar uniformes de sombreado para enviar estos datos de color, necesitaríamos dibujar cada partícula de diferentes colores en su propia llamada de dibujo, haciendo que el sistema de partículas sea mucho más costoso. En cambio, podemos hornear estos colores en los datos de vértice de las partículas y renderizar todo el lote en una sola llamada.

Parece que Unity utiliza esta técnica para la variación del color de las partículas, así como para colorear caracteres individuales en TextMesh o Sprites renderizados juntos en un lote.

Creo que puede hacer algo similar con la creación de instancias de geometría, pero no sé cómo se comparan los dos en rendimiento. Es posible que hoy hacer este tipo de ajustes instanciados a través de los colores de vértice sea más una suspensión para admitir hardware anterior a OpenGL 3.1 / DX9 como algunos dispositivos móviles, en lugar de una mejor práctica para las PC modernas. Agradecería los comentarios de personas que han realizado más ajustes de rendimiento con lotes e instancias para ayudar a aclarar si estas técnicas han reemplazado los colores de vértice para este propósito. :)

DMGregory
fuente