Frage

Ahoi!

Ich habe versucht, alten Testcode zu aktualisieren, um die neuen Funktionen von GLKit aufzufrischen. Bisher habe ich es geschafft, einen GLKViewController einzurichten und einige grundlegende Formen zu rendern, aber ich hatte Mühe, anständige Informationen zu GLKBaseEffect zu finden.

In der GLKBaseEffect-Dokumentation heißt es:

Zum Zeitpunkt der Initialisierung erstellt Ihre Anwendung zunächst einen OpenGL ES 2.0-Kontext und macht ihn aktuell. Anschließend wird ein neues Effektobjekt zugewiesen und initialisiert, seine Eigenschaften konfiguriert und die prepareToDraw-Methode aufgerufen. Durch das Binden eines Effekts wird ein Shader kompiliert und an den aktuellen OpenGL ES-Kontext gebunden. Für den Basiseffekt müssen außerdem Scheitelpunktdaten von Ihrer Anwendung bereitgestellt werden. Erstellen Sie ein oder mehrere Vertex-Array-Objekte, um Scheitelpunktdaten bereitzustellen. Für jedes vom Shader benötigte Attribut sollte das Vertex-Array-Objekt das Attribut aktivieren und auf Daten verweisen, die in einem Vertex-Pufferobjekt gespeichert sind.

Was ich nur schwer erkennen kann, ist:

Benötige ich ein GLKBaseEffect-Objekt für jedes "Modell", das ich rendere? Oder verwende ich einen einzelnen GLKBaseEffect für jede "Szene" und ändere einfach die Eigenschaften im laufenden Betrieb, bevor ich prepareToDraw aufrufe?

Ich habe einige Tutorials für Game-Engines und Renderer gesehen, die einfach einen einzelnen GLKBaseEffect für jedes Modell verwenden, aber dies scheint völlig ineffizient zu sein, wenn dasselbe stattdessen mit einer einzelnen Instanz erreicht werden könnte.

Nach dem Lesen der Dokumentation scheint dies fast der beste Ansatz zu sein, aber wenn man bedenkt, dass ich so viele Leute gesehen habe, die mehrere Instanzen verwenden, denke ich, dass dies nicht der Fall ist.

Kann jemand Licht ins Dunkel bringen? GLKit ist für iOS (und für mich) noch ziemlich neu, daher wären alle Informationen sehr willkommen.

War es hilfreich?

Lösung

Nein, Sie sollten nicht für jedes Objekt einen eindeutigen GLKBaseEffect erstellen.Wenn Sie beispielsweise ein Labyrinth zeichnen, kann jeder Stein in diesem Labyrinth ein eigenes Objekt sein, aber alle können denselben GLKBaseEffect verwenden.Denken Sie jedoch daran, dass GLKBaseEffect auch Informationen an Ort und Stelle sowie Textur, Beleuchtung, Nebel usw. speichert. Wenn Sie also die Steine an mehr als einer Stelle zeichnen möchten (was ich davon ausgehe :-), optimieren Sie ihre Transformationsmatrix und rufen dann aufdie 'prepareToDraw'-API.

Ich stimme zu, dass wir mehr Tutorials benötigen, die von Leuten geschrieben wurden, die GLKBaseEffect ausgiebig verwendet haben, um mehr Informationen zu Best Practices für dieses neue Framework zu erhalten.

Viel Spaß beim Segeln.

Andere Tipps

Bei jeder Änderung der "grundlegenden" Eigenschaften (lightingType, lightModelTwoSided, colorMaterialEnabled, ...) wird beim nächsten Aufruf von "prepareToDraw" ein neues Shader-Programm geladen.

Wenn Sie also keine Renderreihenfolge verwenden, spielt es keine Rolle, ob Sie für jedes gerenderte Objekt einen Effekt oder für alle Objekte einen einzelnen Änderungseffekt verwenden.In beiden Fällen erhalten Sie einen unnötigen glUseProgram-Aufruf und viele unnötige OpenGL-Statusänderungen für jedes gezeichnete Objekt.(Verwenden Sie die Instrumentenvorlage "OpenGL ES Analysis", um die generierten OpenGL-Aufrufe zu untersuchen.)

Das heißt, Ihr Hauptanliegen sollte es sein, Ihre Objekte zum Rendern zu bestellen.Gruppieren Sie mindestens alle Objekte, die dasselbe Shader-Programm verwenden.Erstellen und verwenden Sie dann ein GLKBaseEffect-Objekt für jede dieser Gruppen. Wenn Sie nicht sicher sind, ob eine Änderung der GLKBaseEffect-Eigenschaft dazu führt, dass ein neues Shader-Programm geladen wird, empfehle ich die Verwendung von Instrumenten zur Untersuchung der OpenGL-Aufrufe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top