Che cos'è un colore di vertice?


31

La mia domanda è cosa è scritto nel titolo. Questo termine "colore dei vertici" appare molto. Non riesco a capirlo.

Per esempio:

Un vertice non è un semplice punto sullo spazio 3D? In tal caso, come può un punto avere un colore? O questo "colore" significa qualcos'altro?

Esiste un nodo "Colore vertice" nell'editor dei materiali del motore irreale.

Qualcuno può fare luce sulla mia domanda? Non sono riuscito a trovare nulla di utile quando ho cercato su google "cos'è un colore di vertice" ma le documentazioni che sono troppo tecniche per me.


2
In geometria un vertice è solo un punto nello spazio. Ma per il rendering 3D vuoi che le cose appaiano belle, il che potrebbe significare allegare più informazioni a ciascun vertice, come un colore, una coordinata di trama o pesi scheletrici in modo da poter animare la mesh più facilmente o una normale direzione da utilizzare nell'illuminazione calcoli.
user253751

3
Penso che gran parte della tua confusione sia dovuta alla frequente combinazione di termini "vertice" e "posizione" in 3D / grafica. Matematicamente, la tua affermazione "Non è un punto semplice vertice sullo spazio 3D?" È corretta, ma nel regno dei motori di gioco e della grafica, no, una posizione è un semplice punto nello spazio 3D; e un vertice (mesh) è un pezzo di dati che ha quasi sempre una posizione, ma può anche avere una normale, tangente, coordinata di trama, colore e / o uno qualsiasi dei numerosi altri pezzi di dati . Un vertice mesh è in realtà solo un blocco di dati che viene elaborato nella fase di vertice del rendering.
Slipp D. Thompson,

Risposte:


29

I colori dei vertici non sono così rilevanti quando hai una mesh 3d completamente strutturata. Ma diventa interessante quando hai una mesh non strutturata ma colorata. In tal caso, assegni un colore a ogni vertice. Lo shader avrebbe quindi colorato ogni pixel di un poligono interpolando tra i colori dei tre vertici.

I colori dei vertici possono talvolta essere interessanti in combinazione con le trame. Quando si desidera utilizzare un algoritmo di ombreggiatura come Gouraud Shading , si calcola semplicemente l'intensità della luce su ciascun vertice, si assegna il colore della luce al vertice come colore di vertice e quando si rende la trama si moltiplica il valore del colore di ciascun pixel della trama con i colori interpolati. Ciò consente di calcolare le fonti luminose nello shader di vertice anziché nello shader di pixel. Questo di solito è molto più veloce, perché lo shader di vertice viene di solito eseguito molto meno frequentemente.


2
tra l'altro, il colore del vertice veniva usato in alcuni giochi più vecchi che non avevano lampi / ombre dinamici. Ad esempio, Richard Burns Rally del 2004 utilizza il colore dei vertici per creare trame dall'aspetto diverso e applicare ombre.
martin

The Witness è un gioco recente che fa ampio uso dei colori dei vertici e delle mappe luminose, ma non di molte trame.
user253751

@Philipp "perché lo shader di vertice viene di solito eseguito molto meno frequentemente" Perché? Il vertex shader non fa parte della pipeline di rendering e quindi esegue ogni frame? Perché così meno frequentemente? Il "colore" del vertice non dovrebbe essere calcolato anche su ogni fotogramma, proprio come se fosse nel pixel shader?
Nikos

1
@Nikos Uno shader di vertici viene chiamato una volta per vertice. Un pixel shader viene quindi chiamato una volta per pixel. Un poligono con 3 vertici di solito genera più di 3 pixel sullo schermo (se il gioco finisce per calcolare molti poligoni che coprono meno di 3 pixel, potresti voler esaminare cosa puoi fare per quanto riguarda l'abbattimento e LOD).
Philipp

25

In teoria, Vertex Color consente di colorare un modello senza doversi preoccupare delle trame. Questo è abbastanza comune nel CAD.

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

In pratica, è solo uno slot in più che puoi usare per inserire i dati nel vertice, che poi usi nel vertex shader per fare cose folli .

"Un vertice non è un semplice punto sullo spazio 3D?"

Questo è quello che pensavo, quando ho iniziato con il 3D. Ho imparato rapidamente che mi sbagliavo .

Puoi pensare a un vertice come un blob di dati che costituisce un angolo di un triangolo che vuoi disegnare sullo schermo (e né la parte "angolo" né le parti "triangolo", "disegno" o "schermo" sono sempre vere ). La posizione è a scelta - aspetto di quel BLOB di dati che chiamiamo vertice.

C'è molto che puoi fare allegando ulteriori dati al vertice. L'esempio più famoso è che puoi aggiungere coordinate uv per disegnare una trama su quel triangolo. (Di solito) non puoi decidere quale parte di una trama disegnare sul triangolo se hai solo un punto: hai anche bisogno delle coordinate della trama.

Altri esempi standard di ciò che è in quel blob sono normali e tangenti. L'importante è che siano tutti opzionali, inclusa la posizione. Vertex Color è solo uno di questi input opzionali che puoi usare o abusare per creare una bella immagine sullo schermo.


2
".. come un blob di dati che costituisce un bordo di un triangolo" anche questo non è necessariamente. I vertici potrebbero essere resi come punti bene.
Kromster dice di sostenere Monica il

3
Per alcuni grandi esempi degli effetti shader che puoi ottenere usando i colori dei vertici, ti consiglio vivamente di dare un'occhiata al discorso GDC di Natalie Burke dell'anno scorso, "Animating With Math" (il video è solo per i membri al momento, ma le diapositive sono gratuite qui ) . Mostra quante delle animazioni degli equipaggiamenti di Destiny, i capelli e la stoffa del personaggio e persino parti dei loro nemici e ambienti sono state realizzate usando shader di vertici, modellati e controllati con canali di colore dei vertici.
DMGregory

5
Direi che quelli non erano i colori dei vertici, ma gli attributi dei vertici mostrati come colori per una percezione più semplice.
Kromster dice di sostenere Monica il

Ci sono alcuni usi altrettanto inventivi degli shader di vertici in questo discorso su FortNite , anche se se ricordo bene penso che per lo più usassero i canali UV dei vertici piuttosto che i canali di colore.
DMGregory

3
A rigor di termini dal punto di vista della geometria / matematica un vertice è solo un punto nello spazio. Il "colore del vertice" è un attributo applicato al vertice dall'idea di un vertice utilizzato dalle GPU. È lo stesso di un cerchio che ha un colore o meno. L '"idea" geometrica / matematica di un cerchio non ha un colore ma l' "idea" del software di rendering di un cerchio associa un colore al cerchio. Quindi l'argomento di @ Kromster è tecnicamente più corretto.
Pharap,

8

I vertici possono avere colori, è una proprietà come la normale.

Negli ambienti 3d un triangolo viene colorato in base alle informazioni sul colore dei loro vertici. I frammenti più vicini al vertice A ottengono il colore di esso, i più vicini al vertice B ottengono il colornof di B e il colore si interpola tra i 2.

Funziona allo stesso modo dell'illuminazione per vertice

È un modo semplice per aggiungere colori a un modello senza usare una trama.


+1 per aver fornito un (eventualmente) familiare esempio di un altro attributo vertice simile
CA

Il problema con i colori e le normali dei vertici è che assumono che il vertice faccia parte di una mesh (un'approssimazione di una superficie curva). Se vuoi bordi affilati o facce di colore diverso (come su un cubo), hai bisogno di vertici separati per ogni faccia, il che aumenta notevolmente l'utilizzo della memoria (e rallenta il rendering).
amI

@aml È possibile utilizzare l'operatore "flat" in glsl per rendere l'ombreggiatura piatta. Non è completamente lo stesso, ma funziona.
Bálint,

altro attributo interpolato: coordinate delle coordinate e buffer z! abbiamo lo shader di vertice che calcola alcuni dati per ciascuno dei 3 vertici del triangolo, quelli sono interpolati quando si disegna il triangolo sullo schermo (o in qualche buffer) e lo shader di pixel viene chiamato con il valore interpolato per ogni pixel disegnato
user1952009

@aml Naturalmente x2 non è un collo di bottiglia. E gli shader della geometria sono fatti per questo, direi (ad esempio: trasformare una trama di profondità in triangoli )
user1952009

2

Ci sono già solide risposte: voglio solo entrare in sintonia con un modo più comune di vedere i colori dei vertici utilizzati:

Variare i colori degli oggetti (o altri attributi) all'interno di una singola chiamata batch / draw.

Vedrai questo usato nel rendering di sistemi di particelle, testo e sprite in batch (di solito in classe).

Immagina di avere un emettitore di particelle che genera particelle con un colore iniziale casuale o che si attenua a 0 alfa durante la vita delle particelle. Se dovessimo usare le uniformi shader per inviare questi dati di colore, dovremmo disegnare ogni particella di colore diverso nella sua chiamata di disegno, rendendo il sistema particellare molto più costoso. Invece, possiamo inserire questi colori nei dati del vertice per le particelle e rendere l'intero batch insieme in una singola chiamata.

Unity sembra utilizzare questa tecnica per la variazione del colore delle particelle, nonché per colorare singoli caratteri in una TextMesh o Sprites renderizzati insieme in un batch.

Credo che tu possa fare qualcosa di simile con l'istanziazione della geometria, ma non so come i due si confrontino nelle prestazioni. È possibile che oggi fare questo tipo di modifica istanziata attraverso i colori dei vertici sia più un supporto per supportare l'hardware pre-OpenGL 3.1 / DX9 come alcuni dispositivi mobili, piuttosto che una buona pratica per i PC moderni. Accolgo con favore i commenti di persone che hanno fatto maggiore ottimizzazione delle prestazioni con batch e istanza per aiutare a chiarire se queste tecniche hanno sostituito i colori dei vertici per questo scopo. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.