Mehrere Modelle in Metal. Wie?

8

Das ist eine absolute Anfängerfrage.

Hintergrund: Ich bin nicht wirklich ein Spieleentwickler, aber ich versuche, die Grundlagen der Low-Level-3D-Programmierung zu lernen, weil es ein lustiges und interessantes Thema ist. Ich habe Apples Metal als Grafik-Framework ausgewählt. Ich kenne SceneKit und andere Frameworks auf höherer Ebene, aber ich versuche absichtlich, die Low-Level-Bits zu lernen. Leider bin ich weit von meiner Tiefe entfernt, und es scheint sehr wenig Anfänger-orientierte Metal-Ressourcen im Web zu geben.

Indem ich die Apple-Dokumentation gelesen habe und den Tutorials gefolgt bin, die ich finden konnte, habe ich es geschafft, einen einfachen Vertex-Shader und einen Fragment-Shader zu implementieren und ein tatsächliches 3D-Modell auf dem Bildschirm zu zeichnen. Jetzt versuche ich ein zweites Modell zu zeichnen, aber ich stecke irgendwie fest, weil ich nicht wirklich sicher bin, was wirklich der beste Weg ist.

Tu ich ...

  • Verwenden Sie für alle meine Modelle einen einzelnen Vertex- und Indexpuffer und teilen Sie MTLRenderCommandEncoder die Offsets beim Rendern der einzelnen Modelle mit?
  • Haben Sie für jedes Modell einen eigenen Vertexpuffer / Indexpuffer? Würde solch ein Ansatz skalieren?
  • Noch etwas?

TL; DR: Was ist die empfohlene Methode zum Speichern der Vertexdaten mehrerer Modelle in Metal (oder einem anderen 3D-Framework)?

    
Tamas Czinege 27.12.2015, 21:59
quelle

2 Antworten

5

Es gibt keinen empfohlenen Weg. Wenn Sie auf einem so niedrigen Level wie Metal arbeiten, gibt es viele Möglichkeiten, und die, die Sie auswählen, hängt stark von der Situation ab und welchen Leistungsmerkmalen Sie optimieren möchten. Wenn du nur mit Intro-Projekten herumspielst, sind die meisten dieser Entscheidungen irrelevant, weil die Performance-Probleme erst dann aufkommen, wenn du zu einem "echten" Projekt hochskalierst.

Normalerweise verwenden Game-Engines einen Puffer (oder einen Satz von Vertex / Index-Puffern) pro Modell, insbesondere wenn jedes Modell unterschiedliche Render-Zustände (z. B. Shader, gebundene Texturen) erfordert. Dies bedeutet, dass wenn neue Modelle in die Szene eingeführt werden oder alte nicht mehr benötigt werden, die erforderlichen Ressourcen in den GPU-Speicher geladen / daraus entfernt werden können (durch Erzeugen / Zerstören von MTL-Objekten).

Der Hauptanwendungsfall für das Ausführen mehrerer Draws aus (verschiedenen Teilen) desselben Puffers ist, wenn Sie den Puffer mutieren. Zum Beispiel verwenden Sie bei Frame n die ersten 1 KB eines Puffers zum Zeichnen, während Sie gleichzeitig neue Vertex-Daten berechnen / streamen und sie auf die zweite 1 KB davon schreiben der Puffer ... dann für Frame n + 1 Sie wechseln, welche Teile des Puffers für was verwendet werden.

    
rickster 05.01.2016, 22:05
quelle
1

Um der Antwort von rickster ein bisschen hinzuzufügen, würde ich Ihr Modell in eine Klasse kapseln, die einen Puffer (oder zwei, wenn Sie den Indexpuffer zählen) pro Modell enthält und einen optionalen Parameter mit der Anzahl der Instanzen dieses Modells übergeben Sie möchten erstellen.

Behalten Sie dann einen zusätzlichen Puffer, in dem Sie die Variationen speichern, die Sie pro Instanz einführen möchten. Normalerweise ist es nur die Transformation und ein anderes Material. Zum Beispiel,

%Vor%

In meinem Fall enthält das Material eine UV-Transformation, aber die Textur muss für alle Instanzen gleich sein.

Dann würde deine Modellklasse ungefähr so ​​aussehen,

%Vor%

Ihr Vertex-Shader mit Instanzen sieht ungefähr so ​​aus,

%Vor%

Hier ist ein Beispiel, das ich über die Verwendung von Instancing mit einer Leistungsanalyse geschrieben habe: Ссылка

Sie können den vollständigen Code als Referenz hier finden: Ссылка

Ich hoffe, das hilft.

    
endavid 29.12.2016 17:50
quelle

Tags und Links