Was ist eine Scheitelpunktfarbe?

31

Meine Frage ist, was in Titel geschrieben steht. Dieser Begriff "Scheitelpunktfarbe" taucht häufig auf. Es fällt mir schwer, das zu verstehen.

Beispielsweise:

Ist ein Eckpunkt nicht ein einfacher Punkt im 3D-Raum? Wenn ja, wie kann ein Punkt eine Farbe haben? Oder bedeutet diese "Farbe" etwas anderes?

Es gibt einen Knoten "Vertex Color" im Materialeditor der unreal engine.

Kann jemand meine Frage beleuchten? Ich konnte nichts Nützliches finden, als ich "Was ist eine Scheitelpunktfarbe" googelte, aber die Dokumentationen, die mir zu technisch sind.

Bora
quelle
2
In der Geometrie ist ein Scheitelpunkt nur ein Punkt im Raum. Für 3D-Rendering möchten Sie jedoch, dass die Elemente gut aussehen. Dies kann bedeuten, dass Sie jedem Scheitelpunkt mehr Informationen hinzufügen, z. B. eine Farbe, eine Texturkoordinate oder Skelettgewichte, damit Sie das Netz einfacher animieren können, oder eine normale Beleuchtungsrichtung Berechnungen.
user253751
3
Ich denke, ein großer Teil Ihrer Verwirrung ist auf die häufige Verbindung der Begriffe „Scheitelpunkt“ und „Position“ in 3D / Grafik zurückzuführen. Mathematisch ist Ihre Aussage „Ist ein Eckpunkt nicht ein einfacher Punkt im 3D-Raum?“ Korrekt, aber im Bereich der Game Engines und Grafiken ist eine Position ein einfacher Punkt im 3D-Raum. und ein (Maschen-) Scheitelpunkt ist ein Datenelement, das fast immer eine Position hat, aber auch eine normale Tangente, Texturkoordinate, Farbe und / oder eines von zahlreichen anderen Datenelementen haben kann . Ein Mesh-Vertex ist eigentlich nur ein Datenblock, der in der Vertex-Phase des Renderns verarbeitet wird.
Slipp D. Thompson

Antworten:

29

Scheitelpunktfarben sind nicht so relevant, wenn Sie ein vollständig texturiertes 3D-Netz haben. Interessant wird es jedoch, wenn Sie ein unstrukturiertes, aber farbiges Netz haben. In diesem Fall weisen Sie jedem Scheitelpunkt eine Farbe zu. Der Shader färbt dann jedes Pixel eines Polygons durch Interpolation zwischen den Farben der drei Scheitelpunkte.

Scheitelpunktfarben können auch manchmal in Kombination mit Texturen interessant sein. Wenn Sie einen Schattierungsalgorithmus wie Gouraud Shading verwenden möchten, berechnen Sie einfach die Lichtintensität für jeden Scheitelpunkt, weisen dem Scheitelpunkt die Lichtfarbe als Scheitelpunktfarbe zu und multiplizieren beim Rendern der Textur den Farbwert jedes Texturpixels mit die interpolierten Farben. Auf diese Weise können Sie Lichtquellen im Vertex-Shader anstelle des Pixel-Shaders berechnen. Dies ist in der Regel weitaus schneller, da der Vertex-Shader in der Regel weitaus seltener ausgeführt wird.

Philipp
quelle
2
Übrigens wurde Vertex-Farbe in einigen älteren Spielen verwendet, die keine dynamischen Blitze / Schatten hatten. Beispielsweise verwendet Richard Burns Rally aus dem Jahr 2004 Scheitelpunktfarben, um unterschiedlich aussehende Texturen zu erstellen und Schatten anzuwenden.
Martin
The Witness ist ein neues Spiel, bei dem Scheitelpunktfarben und Lightmaps in großem Umfang verwendet werden, jedoch nicht viele Texturen.
user253751
@Philipp "weil der Vertex-Shader normalerweise viel seltener ausgeführt wird" Warum? Ist der Vertex-Shader nicht Teil der Rendering-Pipeline und wird daher jeder Frame ausgeführt? Warum so selten? Müsste der Scheitelpunkt "Farbe" nicht auch für jedes Bild berechnet werden, so als ob es im Pixel-Shader wäre?
Nikos
1
@Nikos Ein Vertex-Shader wird einmal pro Vertex aufgerufen. Ein Pixel-Shader wird dann einmal pro Pixel aufgerufen. Ein Polygon mit 3 Scheitelpunkten führt normalerweise zu mehr als 3 Bildschirmpixeln (wenn Ihr Spiel am Ende viele Polygone berechnet, die weniger als 3 Pixel umfassen, sollten Sie sich überlegen, was Sie in Bezug auf Culling und LOD tun können).
Philipp
25

Mit Vertex Color können Sie theoretisch ein Modell einfärben, ohne sich um Texturen kümmern zu müssen. Dies ist im CAD durchaus üblich.

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

In der Praxis ist es nur ein weiterer Slot, den Sie verwenden können, um Daten in den Scheitelpunkt zu verschieben, den Sie dann im Scheitelpunkt-Shader verwenden, um verrückte Dinge zu erledigen .

"Ist ein Eckpunkt nicht ein einfacher Punkt im 3D-Raum?"

Das habe ich gedacht, als ich zum ersten Mal mit 3D angefangen habe. Ich habe schnell gelernt, dass ich falsch lag .

Sie können sich einen Scheitelpunkt als einen Datenfleck vorstellen, der eine Ecke eines Dreiecks bildet, das Sie auf dem Bildschirm zeichnen möchten (und weder der "Ecken" -Teil noch der "Dreieck" -, "Mal" - oder "Bildschirm" -Teil sind immer wahr ). Die Position ist eine -optionale - Aspekt dieses Datenblobs, den wir Vertex nennen.

Es gibt eine Menge, die Sie tun können, indem Sie dem Scheitelpunkt zusätzliche Daten hinzufügen. Das bekannteste Beispiel ist, dass Sie UV-Koordinaten hinzufügen können, um eine Textur auf dieses Dreieck zu zeichnen. Sie können (normalerweise) nicht entscheiden, welcher Teil einer Textur auf dem Dreieck gezeichnet werden soll, wenn Sie nur einen Punkt haben - Sie benötigen auch Texturkoordinaten.

Andere Standardbeispiele für den Inhalt dieses Blobs sind Normalen und Tangenten. Wichtig ist, dass alle optional sind, einschließlich der Position. Vertex Color ist nur eine dieser optionalen Eingaben, die Sie verwenden oder missbrauchen können, um ein hübsches Bild auf dem Bildschirm zu erstellen.

Peter
quelle
2
"... als ein Daten-Blob, der eine Kante eines Dreiecks bildet", auch das ist nicht unbedingt notwendig. Scheitelpunkte können als Punkte dargestellt werden.
Kromster sagt Unterstützung Monica
3
Für einige große Beispiele für die Shader - Effekte können Sie mit Vertexfarben erreichen, ich Check - out Natalie Burke GDC Gespräch aus dem letzten Jahr sehr empfehlen „Animieren Mit Math“ (Video ist nur für Mitglieder im Moment, aber die Rutschen sind hier frei ) . Sie zeigt, wie viele der Animationen in Destinys Ausrüstung, den Haaren und Kleidungsstücken der Charaktere und sogar Teilen ihrer Feinde und Umgebungen mit Vertex-Shadern erzielt wurden, die mit Vertex-Farbkanälen geformt und gesteuert wurden.
DMGregory
5
Ich würde argumentieren, dass diejenigen , die nicht Vertexfarben waren, aber Vertex - Attribute wie Farben für einfache Wahrnehmung gezeigt.
Kromster sagt Unterstützung Monica
Es gibt einige ähnlich erfinderische Verwendungen von Vertex-Shadern in diesem Vortrag über FortNite , obwohl ich mich richtig erinnere, dass sie hauptsächlich die UV-Kanäle der Vertices und nicht die Farbkanäle verwendeten.
DMGregory
3
Streng genommen ist ein Scheitelpunkt aus geometrischer / mathematischer Sicht nur ein Punkt im Raum. Die 'Scheitelpunktfarbe' ist ein Attribut, das dem Scheitelpunkt durch die 'Idee' eines von GPUs verwendeten Scheitelpunkts zugewiesen wird. Es ist dasselbe wie ein Kreis, der eine Farbe hat oder nicht. Die geometrische / mathematische "Idee" eines Kreises hat keine Farbe, aber die Rendering-Software "Idee" eines Kreises ordnet dem Kreis eine Farbe zu. Somit ist das Argument von @ Kromster technisch korrekter.
Pharap
8

Scheitelpunkte können Farben haben, es ist eine Eigenschaft wie die normale davon.

In 3D-Umgebungen wird ein Dreieck basierend auf den Farbinformationen der Scheitelpunkte eingefärbt. Die Fragmente, die dem Scheitelpunkt A am nächsten sind, erhalten dessen Farbe, die Fragmente, die dem Scheitelpunkt B am nächsten sind, erhalten die Farbe von B, und die Farbe interpoliert zwischen den beiden.

Dies funktioniert genauso wie die Per-Vertex-Beleuchtung

Auf einfache Weise können Sie einem Modell Farben hinzufügen, ohne eine Textur zu verwenden.

Bálint
quelle
+1 für ein (hoffentlich) bekanntes Beispiel für ein anderes ähnliches Vertex-Attribut
AC
Das Problem bei Scheitelpunktfarben und -normalen besteht darin, dass angenommen wird, dass der Scheitelpunkt Teil eines Gitters ist (eine Annäherung an eine gekrümmte Oberfläche). Wenn Sie scharfe Kanten oder unterschiedlich gefärbte Flächen (z. B. auf einem Würfel) möchten, benötigen Sie separate Scheitelpunkte für jede Fläche, was die Speichernutzung erheblich erhöht (und das Rendern verlangsamt).
amI
@aml Sie können den flachen "Operator" in glsl verwenden, um die Schattierung flach erscheinen zu lassen. Es ist nicht ganz dasselbe, aber es funktioniert.
Bálint
anderes interpoliertes Attribut: Texturkoordinate und Z-Buffer! wir haben die Vertexshader einige Daten für jede der 3 Eckpunkte des Dreiecks Berechnung jene interpoliert werden , wenn auf dem Bildschirm das Dreieck Zeichnung (oder in einigen Puffer), und die Pixel - Shader wird mit den interpolierten Wert für jedes gezeichnete Pixel genannt
user1952009
@aml Natürlich ist x2 kein Flaschenhals. Und dafür sind Geometrie-Shader gemacht, würde ich sagen (zB: Umwandlung einer Tiefenstruktur in Dreiecke )
user1952009
2

Hier gibt es bereits solide Antworten - ich möchte nur auf eine weitere übliche Weise eingehen, bei der Scheitelpunktfarben verwendet werden:

Unterschiedliche Objektfarben (oder andere Attribute) innerhalb eines einzelnen Batch / Draw-Aufrufs.

Dies wird beim Rendern von Partikelsystemen, Text und gestapelten (normalerweise zusammengefassten) Sprites verwendet.

Stellen Sie sich vor, Sie haben einen Partikelemitter, der Partikel mit einer zufälligen Startfarbe erzeugt oder der im Laufe der Lebensdauer der Partikel auf 0 Alpha abfärbt. Wenn wir Shader-Uniformen zum Senden dieser Farbdaten verwenden würden, müssten wir jedes andersfarbige Partikel in einem eigenen Aufruf zeichnen, was das Partikelsystem erheblich verteuert. Stattdessen können wir diese Farben in die Scheitelpunktdaten für die Partikel einbrennen und den gesamten Stapel in einem einzigen Aufruf zusammen rendern.

Unity scheint diese Technik zur Variation der Partikelfarbe sowie zum Färben einzelner Zeichen in einem TextMesh oder Sprites zu verwenden, die in einem Stapel gerendert werden.

Ich glaube, Sie können mit Geometrieinstanzen etwas Ähnliches tun, aber ich weiß nicht, wie sich die beiden in der Leistung vergleichen lassen. Es ist heute möglich, dass diese Art der instanziierten Optimierung durch Vertex-Farben eher eine Verzögerung darstellt, um Hardware vor OpenGL 3.1 / DX9 wie einige Mobilgeräte zu unterstützen, als eine bewährte Methode für moderne PCs. Ich würde Kommentare von Leuten begrüßen, die mehr Performance-Optimierungen mit Batches und Instanzen durchgeführt haben, um zu klären, ob diese Techniken zu diesem Zweck Scheitelpunktfarben ersetzt haben. :)

DMGregory
quelle