O que é uma cor de vértice?

31

Minha pergunta é o que está escrito no título. Este termo "cor de vértice" aparece muito. Estou tendo dificuldade para entender isso.

Por exemplo:

Não é um ponto simples de vértice no espaço 3D? Se sim, como um ponto pode ter uma cor? Ou essa "cor" significa outra coisa?

Há um nó "Vertex Color" no editor de material do mecanismo irreal.

Alguém pode esclarecer minha pergunta? Não consegui encontrar nada útil quando pesquisei "o que é uma cor de vértice", exceto as documentações que são muito técnicas para mim.

Bora
fonte
2
Na geometria, um vértice é apenas um ponto no espaço. Mas, para a renderização em 3D, você deseja que as coisas tenham uma boa aparência, o que pode significar anexar mais informações a cada vértice, como uma cor, coordenada de textura ou pesos esqueléticos, para que você possa animar a malha mais facilmente ou uma direção normal para usar na iluminação. cálculos.
user253751
3
Penso que grande parte da sua confusão se deve ao conflito frequente de termos “vértice” e “posição” em 3D / gráficos. Matematicamente, sua afirmação “Não é um ponto simples de vértice no espaço 3D?” Está correta, mas no campo dos mecanismos e gráficos de jogos, não, uma posição é um ponto simples no espaço 3D; e um vértice (malha) é um dado que quase sempre tem uma posição, mas também pode ter uma coordenada normal, tangente, de textura, cor e / ou qualquer um dos vários outros dados . Um vértice de malha é realmente apenas um pedaço de dados processados ​​no estágio de renderização do vértice.
Slipp D. Thompson

Respostas:

29

As cores dos vértices não são tão relevantes quando você tem uma malha 3D totalmente texturizada. Mas fica interessante quando você tem uma malha não texturizada, mas colorida. Nesse caso, você atribui uma cor a cada vértice. O sombreador coloria cada pixel de um polígono interpolando entre as cores dos três vértices.

Às vezes, cores de vértice também podem ser interessantes em combinação com texturas. Quando você deseja usar um algoritmo de sombreamento como o Gouraud Shading , basta calcular a intensidade da luz em cada vértice, atribuir a cor da luz ao vértice como uma cor de vértice e, ao renderizar a textura, multiplica o valor da cor de cada pixel de textura por as cores interpoladas. Isso permite calcular fontes de luz no sombreador de vértice, em vez do sombreador de pixel. Isso geralmente é muito mais rápido, porque o shader de vértice geralmente é executado com muito menos frequência.

Philipp
fonte
2
Aliás, a cor do vértice foi usada em alguns jogos mais antigos que não apresentavam sombras / raios dinâmicos. Por exemplo, Richard Burns Rally de 2004 está usando cores de vértice para criar diferentes texturas e aplicar sombras.
martin
The Witness é um jogo recente que faz uso extensivo de cores de vértices e mapas de luz, mas não muitas texturas.
user253751 23/08
@ Philipp "porque o shader de vértice geralmente é executado com muito menos frequência" Por que? O sombreador de vértice não faz parte do pipeline de renderização e, portanto, executa cada quadro? Por que com menos frequência? O vértice "cor" não teria que ser calculado também para cada quadro, como se estivesse no pixel shader?
Nikos
1
@ Nikos Um sombreador de vértice é chamado uma vez por vértice. Um sombreador de pixel é chamado uma vez por pixel. Um polígono com 3 vértices geralmente resulta em mais de 3 pixels na tela (se o seu jogo acabar calculando muitos polígonos que cobrem menos de 3 pixels, convém verificar o que você pode fazer com relação ao descarte e ao LOD).
Philipp
25

Em teoria, o Vertex Color permite colorir um modelo sem ter que se preocupar com texturas. Isso é bastante comum no CAD.

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

Na prática, é apenas mais um slot que você pode usar para inserir dados no vértice, que você usa no sombreador de vértices para fazer coisas malucas .

"Não é um ponto simples de vértice no espaço 3D?"

Era o que eu pensava quando comecei com o 3D. Aprendi rapidamente que estava errado .

Você pode pensar em um vértice como um blob de dados que forma um canto de um triângulo que deseja pintar na tela (e nem a parte "canto" nem as partes "triângulo", "pintura" ou "tela" são sempre verdadeiras ) A posição é unopcional - aspecto desse blob de dados que chamamos de vértice.

Há muito que você pode fazer anexando dados adicionais ao vértice. O exemplo mais famoso é que você pode adicionar coordenadas uv para desenhar uma textura nesse triângulo. Você (geralmente) não pode decidir qual parte de uma textura desenhar no triângulo se você tiver apenas um ponto - você também precisa de coordenadas de textura.

Outros exemplos padrão do que está nesse blob são normais e tangentes. O importante é que todos eles são opcionais, incluindo a posição. Vertex Color é apenas uma dessas entradas opcionais que você pode usar ou abusar para criar uma imagem bonita na tela.

Pedro
fonte
2
".. como um blob de dados que compõe a borda de um triângulo", mesmo que não seja necessariamente. Os vértices podem ser renderizados como pontos.
Kromster diz apoio Monica
3
Para alguns ótimos exemplos dos efeitos de sombreador que você pode obter usando cores de vértice, recomendo conferir a palestra de Natalie Burke no GDC do ano passado, "Animating With Math" (o vídeo é apenas para membros no momento, mas os slides são gratuitos aqui ) . Ela mostra quantas animações dos equipamentos de Destiny, cabelos e roupas de personagens e até partes de seus inimigos e ambientes foram alcançados usando sombreadores de vértices, modelados e controlados com canais de cores de vértices.
DMGregory
5
Eu diria que essas não eram cores de vértice, mas atributos de vértice mostrados como cores para facilitar a percepção.
Kromster diz apoio Monica
Existem alguns usos igualmente inventivos de sombreadores de vértices nesta conversa sobre o FortNite , embora, se bem me lembro, acho que eles usaram principalmente os canais UV dos vértices em vez de canais de cores.
DMGregory
3
A rigor, do ponto de vista baseado em geometria / matemática, um vértice é apenas um ponto no espaço. A 'cor do vértice' é um atributo aplicado ao vértice pela 'ideia' de um vértice usado pelas GPUs. É o mesmo que um círculo de cor ou não. A 'idéia' geométrica / matemática de um círculo não tem uma cor, mas a 'idéia' de um círculo do software de renderização associa uma cor ao círculo. Assim, o argumento de @ Kromster é mais tecnicamente correto.
Pharap
8

Os vértices podem ter cores, é uma propriedade exatamente como o normal.

Nos ambientes 3d, um triângulo é colorido com base nas informações de cores de seus vértices. Os fragmentos mais próximos do vértice A obtêm a cor, o mais próximo do vértice B obtém a cor B e a cor interpola entre os 2.

Funciona da mesma maneira que a iluminação por vértice

É uma maneira fácil de adicionar cores a um modelo sem usar uma textura.

Bálint
fonte
+1 para dar um (espero) exemplo familiar de um outro atributo vértice semelhante
AC
O problema com as cores e normais do vértice é que eles assumem que o vértice faz parte de uma malha (uma aproximação de uma superfície curva). Se você deseja arestas nítidas ou faces coloridas diferentes (como em um cubo), precisará de vértices separados para cada face, o que aumenta consideravelmente o uso de memória (e diminui a renderização).
AMI
@aml Você pode usar o "operador" plano no glsl para fazer com que o sombreamento pareça plano. Não é completamente igual, mas funciona.
Bálint 23/03
outro atributo interpolado: coordenada de textura e buffer z! temos o sombreador de vértice calculando alguns dados para cada um dos três vértices do triângulo, esses são interpolados ao desenhar o triângulo na tela (ou em algum buffer) e o sombreador de pixel é chamado com o valor interpolado de cada pixel desenhado
user1952009
@aml Claro que o x2 não é um gargalo. E shaders de geometria são feitos para isso, eu diria que (por exemplo: transformar uma textura de profundidade em triângulos )
user1952009
2

Já existem respostas sólidas aqui - eu só quero falar com mais uma maneira comum de ver cores de vértice usadas:

Variando as cores do objeto (ou outros atributos) em uma única chamada de lote / sorteio.

Você verá isso usado na renderização de sistemas de partículas, texto e sprites em lotes (geralmente em relevo).

Imagine que você tenha um emissor de partículas que gera partículas com uma cor inicial aleatória ou que desbota até 0 alfa durante a vida útil das partículas. Se usarmos uniformes shader para enviar esses dados de cores, precisaremos desenhar cada partícula de cor diferente em sua própria chamada de desenho, tornando o sistema de partículas muito mais caro. Em vez disso, podemos agrupar essas cores nos dados de vértice das partículas e renderizar todo o lote em uma única chamada.

O Unity parece usar essa técnica para variação de cores de partículas, bem como para colorir caracteres individuais em um TextMesh ou Sprites renderizados juntos em um lote.

Acredito que você pode fazer algo semelhante ao instanciamento da geometria, mas não sei como os dois se comparam no desempenho. É possível que hoje fazer esse tipo de ajuste instanciado através de cores de vértice seja mais um obstáculo para suportar hardware pré-OpenGL 3.1 / DX9 como alguns dispositivos móveis, em vez de uma prática recomendada para PCs modernos. Gostaria de receber comentários de pessoas que fizeram mais ajustes de desempenho com lotes e instanciamento para ajudar a esclarecer se essas técnicas substituíram as cores dos vértices para esse fim. :)

DMGregory
fonte