2014-09-23 11 views
7

Ich arbeite derzeit an einem WebGL-Projekt, obwohl ich mir vorstelle, dass diese Frage in vielen Grafik-APIs generisch ist.Ist das Teilen von Scheitelpunkten zwischen Gesichtern es wert?

Lassen Sie mich das Beispiel eines einfachen Würfels verwenden, um zu demonstrieren, was ich frage.

Ein Würfel hat 6 Flächen mit 4 Ecken pro Fläche, also haben wir insgesamt 24 Ecken, die den Würfel bilden. Wir könnten jedoch die Gesamtzahl der Scheitelpunkte auf nur 8 reduzieren, wenn wir Scheitelpunkte zwischen Gesichtern teilen. Wie ich gelesen habe, kann dies eine Menge wertvollen GPU-Speicher sparen, besonders wenn man mit komplexen Modellen und Szenen arbeitet.

Auf der anderen Seite, habe ich aus erster Hand einige der Nachteile mit Teilen Scheitelpunkte zwischen Gesichtern erfahren. Dazu gehören:

  • Complex Eckpunktnormale Berechnungen, wie wir die ‚durchschnittlichen‘ finden müssen normal für jeden Vertex, unter Berücksichtigung der Flächennormalen jedes Gesicht, dass der Scheitelpunkt ist ein Teil.

  • Einige Scheitelpunkte müssen trotzdem dupliziert werden, um mit den entsprechenden UV-Koordinaten übereinzustimmen.

  • Da ein Scheitelpunkt von vielen Gesichtern gemeinsam genutzt werden kann, können wir keine andere Farbe pro Fläche mit der Scheitelpunkt-Färbung angeben.

Das Buch, das ich betont wirklich die Bedeutung gemeinsamen Nutzung von Vertex gelesen haben Speichernutzung zu minimieren, so dass, wenn ich auf einige der Nachteile der Vertex-Sharing kam, war ich nicht sicher, wie rentabel/hilfreich Vertex Shading wirklich ist Und da der Autor keine der Schattenseiten des Vertex Sharing erwähnt, würde ich gerne die Meinungen von euch hören. Ist also die Speicherersparnis, die durch Vertex Shading erzeugt wird, wirklich so wichtig?

Antwort

5

Die von Ihnen genannten Nachteile sind in der Tat sehr real, besonders für Formen mit vielen scharfen Kanten oder unterschiedlichen Texturen. Ein Würfel ist das schlechteste mögliche Beispiel für die Vertex-Teilung, jeder Eckpunkt hat 3 verschiedene Normalen und möglicherweise Texturkoordinaten. Es ist im Wesentlichen unmöglich, die Ecken zu teilen.

Denken Sie jedoch an eine organische Form. Wie ein Ball, der Körper eines Tieres, Autos, Bäume oder sogar etwas so einfaches wie eine Wüste oder so. Diese Formen benötigen wahrscheinlich eine große Anzahl von Scheitelpunkten, um anständig auszusehen, aber viele dieser Scheitelpunkte werden zwischen Gesichtern geteilt. Sie brauchen die exakt gleichen Normalen, Texturkoordinaten und Whatever, um glatt zu wirken.

Darüber hinaus ist der erste Nachteil nicht wirklich so wichtig. Die Berechnung der Scheitelpunkte kann in der Vorverarbeitung erfolgen, in den meisten Fällen sogar vom Modellierer. Dies wird grundsätzlich nie in Echtzeit gemacht, sondern Sie haben es einfach schon in diesem Format. Allerdings, wenn es in Echtzeit getan werden muss, können Sie sich vorstellen, dass dies zu einem tatsächlichen Problem wird, und Sie müssen anfangen, über die Kompromisse und Profil zu denken. Aber selbst dann kann es wahrscheinlich mit Geometrieshadern gehandhabt werden, wenn die visuelle Treue benötigt wird, kann dies eine bevorzugte Lösung sein.

Zusammenfassend hängt es stark davon ab, was Sie tun. In einigen Fällen ist das Verteilen von Vertex nicht wirklich möglich, weil Sie die erwähnten Gründe angegeben haben. Trotzdem kann es in vielen Fällen viel Speicherplatz sparen.

+1

Vielen Dank für Ihre Antwort. Ich habe einfach angenommen, dass alle Objekte beim Import genau gleich behandelt werden, aber ich denke, dass eine Engine so modifiziert werden kann, dass sie verschiedene Vertex-Sharing-Ebenen handhaben kann. Du hast den Nagel auf den Kopf getroffen, als du einen Würfel erwähnt hast - das ist die Form, die mir die Probleme verursacht.Wenn ich dies also in meiner eigenen Engine implementieren würde, würde ich empfehlen, dass ich Funktionalität hinzufüge, um Objekte mit einer anpassbaren Vertex-Sharing-Ebene zu importieren, so dass diese Objekte wie Cubes korrekt behandelt werden können, während mehr organische Objekte ein hohes Niveau des Teilens? – Armada

+1

Definitiv ist Vertex-Sharing relativ einfach und sollte in Suchmaschinen sicherlich optional/variabel sein. Sie können beliebige Scheitelpunkte beliebig teilen (oder nicht teilen), um die Speichernutzung zu optimieren. – Invalid

Verwandte Themen