Wie viele OpenGL-Programme sollte ich zum Rendern mehrerer Objekte verwenden?

10

Meine Szene enthält mehrere Objekte. (Sagen wir 3 Würfel, 1 Zylinder, 8 Kugeln.) Ich gehe davon aus, dass ich für jeden einen Vertex-Shader erstellen sollte. Wie viele Programme soll ich haben?

Alternativen:

  • Ein Programm pro Objekt
  • Ein Programm für alle Würfel und ein anderes für alle Kugeln (vorausgesetzt, sie verwenden dieselben Shader)
  • Ein großes Programm für alles

Was ist der richtige Ansatz?

Jacks_Gulch
quelle
1
"Ich gehe davon aus, dass ich für jeden einen Vertex-Shader erstellen sollte." Warum nimmst du das an? Ein Vertex-Shader transformiert Vertices entsprechend Ihrem Modell und Ihren Ansichtsmatrizen, und Sie möchten fast immer, dass sie für alle gleich sind.
usm

Antworten:

8

Sie sollten Shader-Programme als ähnlichen Teil des Status wie Texturen betrachten. Das Ändern des Status ist teuer, sodass Sie möglicherweise mehrere Texturen zu einer kombinieren können, um Texturänderungen zu vermeiden. Gleiches gilt für Shader. Möglicherweise können Sie mehrere Shader kombinieren, um Statusänderungen zu vermeiden.

Ähnlich wie beim Kombinieren von Texturen ist das Kombinieren von Shadern mit einem Overhead verbunden. Wenn Sie nur 16 x 16 Pixel aus einer 4096 x 4096-Textur rendern, verwenden Sie die Hardware nicht effizient. Wenn das von Ihnen gerenderte Objekt nur 10% des Codes in Ihrem Shader verwendet, ist es ebenfalls möglich (und sogar wahrscheinlich), dass die Grafikkarte unnötig viele Dinge berechnet.

Kurz gesagt, "hängt davon ab".

Jari Komppa
quelle
4
Darüber hinaus können Sie in vielen Fällen mit nur einem Shader davonkommen. Die Unterschiede bestehen nur in den Uniformen, die Sie an den Shader übergeben, wie Farbe, Textur, normale Karten usw.
Rioki
Ja, zum Beispiel könnten Sie einen "Scaly" -Shader haben, der Fragmente erzeugt, die schuppig aussehen und so funktionieren (die meisten Shader tun es ...), dass Sie damit alle 3 Würfel, 1 Zylinder und 8 Kugeln rendern können ein Shader (natürlich mit entsprechenden Geometrie-Grundelementen). Ein vernünftiger Satz von Uniformen könnte hier ein Vektorwert sein, der die Farbe definiert, und möglicherweise ein paar Skalare oder etwas, das beeinflusst, wie "schuppig" oder "glänzend" der visuelle Effekt sein wird. Dann haben Sie einen Shader und ändern, wie der Shader Fragmente färbt, indem Sie die Uniformen zwischen den Zeichnungen der einzelnen Geometrien ändern.
Steven Lu
5

Es ist am besten, die Dinge so einfach wie möglich zu halten. Das Duplizieren des gleichen Shaders für jedes Objekt ist nicht erforderlich und wird schnell aufgebläht. Sie möchten auch nicht einen riesigen Shader, der jeden möglichen Anwendungsfall abdeckt, da dies unnötigen Overhead verursacht.

Es gibt verschiedene Meinungen zum Shader-Management und keinen "optimalen" Weg, dies zu erreichen. Ich habe sogar einige Shader-Implementierungen gesehen, bei denen jeder Shader im laufenden Betrieb basierend auf Parametern generiert wird (z. B. in der Unreal-Engine ).

Für jemanden, der gerade erst in diesem Bereich anfängt, ist es möglicherweise gut, zuerst die grundlegenden Shader zu zeichnen. Zum Beispiel habe ich einen Shader für texturlose Objekte, einen Shader mit grundlegender Textur- und Pixelbeleuchtungsunterstützung usw. Jedes Mal, wenn ich einen anderen Effekt möchte, der mit einem vorherigen Shader nicht möglich ist, dann habe ich ' Ich werde einen neuen für den neuen Effekt erstellen.

Der Zweck eines solchen Systems ist es, die Dinge einfach zu halten. Gerade. Behalten. Es. Einfach.

Anko
quelle
+1, weil Sie erwähnt haben, was die aktuelle Branche tut.
Krythic