Scheitelpunktdaten in separate Puffer oder eine Struktur aufgeteilt?

7

Ist es besser, alle Scheitelpunktdaten in einer Struktur wie dieser zu haben:

class MyVertex
{
  int x,y,z;
  int u,v;
  int normalx, normaly, normalz;
}

Oder um jede Komponente (Position, Normal, Texturkoordinaten) in separaten Arrays / Puffern zu haben? Für mich schien es immer logisch, die Daten in einer Struktur zusammenzufassen, da sie für jede Instanz eines gemeinsamen Scheitelpunkts immer gleich sind, und dies scheint für Dinge wie Zeichenmodelle zu gelten (z. B. sollte der Normalwert ein Durchschnitt sein benachbarter Normalen für eine gleichmäßige Beleuchtung). Ein Fall, in dem dies nicht zu funktionieren scheint, sind andere Arten von Netzen, z. B. ein Würfel, bei dem die Texturkoordinaten für jeden gleich sind, dies jedoch dazu führt, dass sie unterschiedlich sind, wenn die Scheitelpunkte gemeinsam genutzt werden.

Werden sie normalerweise getrennt gehalten? Werden sie dadurch nicht weniger platzsparend, wenn für jeden Scheitelpunkt eine Instanz von Texturkoordinaten und Normalen vorhanden sein muss (sie werden nicht indiziert)? Kann OpenGL diese Mischung aus indizierten (für den Standort) und nicht indizierten Puffern in demselben VBO überhaupt verarbeiten?

kiba2
quelle

Antworten:

2

Es ist typisch, sie zusammen zu halten. Wenn Sie dann Ihr VBO erstellen, können Sie einfach ein verschachteltes VBO mit allen Daten generieren . Dies ist sehr schnell und eine typische Methode beim Erstellen von VBOs.

Ich habe ein paar verschiedene Datenstrukturen für Eckpunkte. Wenn ich weiß, dass es keine Daten eines bestimmten Typs geben wird, werde ich diesen Datentyp weglassen und nur die vorhandenen Datentypen verschachteln. Zum Beispiel haben einige meiner Modelle Knocheninformationen, die mit den Scheitelpunktdaten verschachtelt sind. Andere nicht. Ich habe also eine Scheitelpunktstruktur, die diese zusätzlichen Informationen enthält, und eine, die dies nicht tut. Ich benutze beide und habe separate Draw-Aufrufe für jeden, um die entsprechenden Zeiger zu setzen.

MichaelHouse
quelle
Ich nehme an, ich versuche herauszufinden, wie Sie den VBO gleichzeitig indizieren können, wenn sich eines oder mehrere der Scheitelpunktattribute für einen gemeinsam genutzten Scheitelpunkt unterscheiden
kiba2
Wenn sich die Scheitelpunktattribute unterscheiden, handelt es sich nicht um einen gemeinsam genutzten Scheitelpunkt. Sie sind nur zwei Eckpunkte, die einige Daten gemeinsam nutzen.
MichaelHouse
0

Angesichts der Bedeutung der Referenzlokalität für den GPU-Cache besteht allgemeiner Konsens darüber, dass Sie immer standardmäßig Vertex-Attribute verschachteln sollten, es sei denn, die Umstände hindern Sie daran ... wie die von Ihnen erwähnten (halb-) gemeinsamen Umstände. Es gibt viele Quellen, die dies auf SO zitieren.

Nicht verschachtelt wird wichtig, wenn Ihr Datensatz sehr groß ist und Sie wirklich keinen Speicherplatz / Systembusbandbreite verschwenden möchten, indem Sie verschachtelte Attribute angeben, die optional sind oder auf andere Weise aus einem kleineren Datensatz abgeleitet werden könnten. Wenn Sie beispielsweise in einem 10M-Vertex-Dataset für jede Gruppe von 4 Vertices darin denselben Wert verwenden könnten, möchten Sie dies wahrscheinlich tun. Bei kleineren Datensätzen würde die einfache Verschachtelung und Wiederholung Ihrer Daten die Notwendigkeit einer Reduzierung außer Kraft setzen.

Ein weiterer Grund, nicht zu verschachteln, besteht darin, dass Sie Ihre Daten modular gestalten möchten, z. B. wenn die Geometrie (dh die Positionen) gleich bleiben, sich jedoch Farbe, normale Karten usw. ändern (denken Sie an die Geometrie menschlicher Charaktere, aber strukturiert wie beispielsweise ein kürzlich gedrehter Borg, in den Implantate eingesetzt werden) unter der Haut gewachsen sind).

Geben Sie hier die Bildbeschreibung ein

Ingenieur
quelle