Ich möchte eine große Anzahl (mehrere Tausend) einfacher Netze zeichnen (jedes vielleicht ... maximal 50 Dreiecke, aber selbst das ist eine sehr große Obergrenze), die alle genau gleich sind.
Als einfache Brute-Force-Methode mache ich gerade Tausende von Zeichenaufrufen, bei denen ich nur die Transformationsmatrizen ändere, die die Shader benötigen, und dann dieselben Objekte erneut zeichne.
Dies ist natürlich schrecklich langsam, da (ich vermute) zu viele Draw Calls für den Treiber und meinen PC erforderlich sind, um effizient zu arbeiten.
Was kann ich tun, um es schneller zu machen?
Antworten:
Die Lösung hierfür ist die Instanz. In diesem Tutorial werden einige Instanzierungsmethoden erläutert. Wenn Sie
ARB_draw_instanced
und habenARB_instanced_arrays
, verwenden Sie sie.Die allgemeine Idee besteht darin, alle Transformationen Ihrer Netze in einem separaten Pufferobjekt zu speichern und dieses an ein Attributarray zu binden, das einen "Scheitelpunkt" pro Instanz über verwendet
glVertexAttribDivisor
.Wenn Sie danach immer noch nicht so schnell laufen, wie Sie möchten, sind Sie wahrscheinlich an den Vertex-Prozessor gebunden. Führen Sie ein Kegelstumpf-Keulen auf den Maschen durch und bauen Sie vorzugsweise einen BVH zum Durchqueren, anstatt das Keulen auf allen Maschen unabhängig voneinander durchzuführen.
quelle
glVertexAttribDivisor
(die in keiner Weise veraltet oder veraltet ist) hat außerdem den Vorteil, dass die Anzahl der Instanzen nicht nach oben begrenzt ist. Die Leistung war in der Vergangenheit besser als bei einheitlichen Puffern, ist jedoch jetzt wahrscheinlich gleich oder sehr ähnlich, und beide Möglichkeiten erfüllen die Aufgabe.