Wenn Sie nur Normalen pro Fläche benötigen und Ihre Texkoordinaten für eine Fläche streng 0/0, 0/1, 1/0, 1/1 (oder ähnlich wie für Ihr Layout) sind, können Sie einen Würfel mit 8 Vert konstruieren und entweder 30 (Strip mit Neustart) oder 36 (Liste) Indizes. Rufen Sie die Normalen und Texcoords mit einer konstanten Array-Suche auf der Grundlage von SV_VertexID in Ihrem Vertex-Shader ab.
Wenn Sie dies tun, müssen Sie nicht einmal Texcoords oder Normalen in Ihren Vertex-Puffer aufnehmen, wodurch Sie noch mehr Speicherplatz sparen.
Wenn Sie noch weiter gehen, können Sie immer noch bis zu 24 Vert pro Würfel gehen, aber Sie können auch Instanzen verwenden. Jeder Würfel hat eine feste Größe in Ihrem Scheitelpunktpuffer (1x1x1), und Sie haben einen Skalierungsfaktor und eine Position (vorausgesetzt, Ihre Würfel drehen sich nicht, wenn dies der Fall ist, eine Matrix) als instanzbezogene Daten. Im nicht rotierenden Fall betragen die einmaligen Kosten 24 Verts, aber dann benötigt jeder Würfel nur 6 Floats, um vollständig spezifiziert zu werden. Im rotierenden Fall sehen Sie 16 Floats, aber selbst das ist eine erhebliche Ersparnis (in diesem Fall besteht eine höhere Wahrscheinlichkeit, dass Sie CPU-seitige Matrixtransformationen in den Hintergrund drängen - für den nicht rotierenden Fall, in dem eine Matrix on the fly in erstellt wird Ihr Vertex-Shader - auch wenn er pro Vertex ausgeführt wird - ist so blöd schnell, dass Sie sich nicht einmal darum kümmern müssen.
Verwenden Sie für flächenbezogene Texturen einfach ein Texturarray. Sie müssen natürlich sicherstellen, dass jede solche Textur im Array die gleiche Größe hat, und Sie müssen Ihren aktuellen Stapel immer noch unterbrechen, wenn sich das Array selbst ändern muss, andernfalls ist dies in Ordnung. Fügen Sie Ihrer Scheitelpunktdefinition ein drittes Texkoord hinzu, das den für jede Fläche zu verwendenden Array-Slice definiert.
Sie benötigen hierfür keine GS, und sie sollte schneller ausgeführt werden als eine, da die Aktivierung der Geometrie-Shader-Stufe einen zusätzlichen Aufwand verursacht.
Ich habe einen Benchmark-Code in meiner Engine, der mit dieser Methode nur ein paar Würfel zeichnet, und ich kann problemlos über 300.000 Würfel durchkauen, während ich auf einer verhältnismäßig Low-End-GPU immer noch 60 fps lösche, ohne irgendetwas anderes zu tun, um den Prozess zu optimieren . Zugegeben, ich beleuchte oder texturiere sie nicht, aber ich habe Alpha-Blending aktiviert, Backface-Culling deaktiviert und insgesamt wird mein Teil "Ich tue nichts anderes, um es zu optimieren" abgewogen, sodass ich Ihnen eine vernünftige Vorstellung davon geben sollte Baseballstadion können Sie mit dieser Methode treffen.