Ich muss viele Polygone zeichnen, die aus 6 Eckpunkten (zwei Dreiecken) bestehen.
Ohne Texturkoordinaten, Normalen usw. ergeben beide Ansätze 72 Bytes. In Zukunft würde ich definitiv auch Texturkoordinaten und Normalen benötigen, wodurch das Zeichnen von Indizes weniger Speicher verbraucht. Nicht viel.
Meine Frage lautet also: Welcher Ansatz ist bei VAOs mit wenigen Scheitelpunktüberlappungen schneller? Ich kümmere mich nicht um den zusätzlichen Speicher, der durch das Zeichnen ohne Index verbraucht wird, sondern nur um die Geschwindigkeit.
Bearbeiten: Um es klar zu machen.
Nicht-Index-Ansatz:
float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,
//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};
Indexansatz:
float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};
int[6] indices = {
//Triangle 1
0,1,2,
//Triangle 2
0,3,2
};
Antworten:
Ich versuche die Frage zu beantworten. Ich denke, dass Sie aus mehreren Gründen mit Indizes gehen sollten:
1) In jedem Fall ist die Indizierung auf der GPU-Seite ein freier Betrieb, Sie werden dort nicht bestraft. (hinzugefügt) Natürlich sind Indizes Direktzugriffsvorgänge und können die Leistung des GPU-Speichercaches beeinträchtigen.
2) Durch die Indizierung kann der GPU-Vertex-Cache möglicherweise die wenigen Optimierungen für überlappende Vertices vornehmen.
3) Ein um ein Vielfaches geringerer Speicherbedarf auf der GPU-Seite bedeutet eine bessere Leistung, da die Speicherbandbreite einer der Engpässe ist und das mehrfache Extrahieren von Vorgängen (z. B. 10_10_10_2 -> 4 x Float) keine Kosten verursacht.
Der Geschwindigkeitsunterschied ist wahrscheinlich nicht erkennbar, wenn es nicht viele überlappende Scheitelpunkte gibt, an denen Sie möglicherweise eine Geschwindigkeitsverbesserung erzielen. Aber ich habe wirklich keine harten Fakten, um meine Meinung zu stützen (passend zu Indizes).
Schauen Sie auch das:
/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate
quelle
Wenn die Positionen immer gleich sind, können Sie sogar auf Puffer verzichten, indem Sie das Array im Shader speichern und
gl_VertexID
den Scheitelpunkt im Scheitelpunkt-Shader auswählen.quelle
Wie bei allen Performance-Dingen, raten Sie nicht, profilieren Sie es, um es herauszufinden.
Dies hängt von der Hardware und sehr vielen komplizierten Faktoren ab. Wenn Sie es durch Profilerstellung messen, werden all diese Dinge automatisch für Sie berücksichtigt, ohne dass Sie etwas darüber wissen müssen.
quelle
Ich gehe davon aus, dass die Indizierung für Scheitelpunkte langsamer ist.
Ich habe die ursprüngliche Frage falsch verstanden, aber hier ist die Antwort für die Farbindizierung. Ich vermute, dass die gleichen Regeln für die Vertex-Indizierung gelten würden (ohne Genauigkeitsverlust), aber das ist nur eine Vermutung.
Aber...
72 Bytes sind so klein, dass es wahrscheinlich speichereffizienter wäre, sie nicht zu indizieren.
Einige Faustregeln: Indizierung ist speichereffizienter. Die Indizierung verliert an Farbgenauigkeit. Nicht indizieren ist schneller.
Dies kann dazu führen, dass Sie niemals die Indizierung verwenden möchten, aber der Speicherkompromiss ist für Bilder mit angemessener Größe ziemlich bedeutend. Die Farbgenauigkeit ist nicht wahrnehmbar.
Die Indizierung funktioniert so, dass beim Zeichnen eines Pixels ein Index angegeben wird und die Farbe in einer Tabelle mit einer vorgegebenen Größe nachgeschlagen werden muss. (Nehmen wir 256 Bytes an, Sie sind also auf 256 Farben beschränkt.) Dann zeichnet es dieses Pixel. Keine Indizierung speichert die Pixeldaten direkt, daher gibt es keine Farbbeschränkungen für 256. In einem 100x100-Bild beträgt Ihr 400-Byte-Bild jetzt 10000 Byte.
Haftungsausschluss, ich ziehe diese Zahlen aus meinem Hut.
quelle