Wie viele aktive Shader an einem Frame im Spiel sollte ich normalerweise verwenden? 5 oder mehr wie 100?

20

Wie viele Shader sind in modernen Spielen normalerweise gleichzeitig in einer Szene aktiv? Ich weiß, dass mehrere Shader verwendet werden, wobei die Spiele in jedem Frame zwischen ihnen wechseln, und es ist üblich, Objekte über den Shader zu zeichnen:

  1. Zeichnen Sie alle Objekte mit Shader eins
  2. Wechseln Sie von Shader eins zu Shader zwei
  3. Zeichnen Sie alle Objekte mit Shader zwei

Ich weiß immer noch, dass es nicht so einfach ist, insbesondere bei Effekten wie einem Glow-Effekt für die gesamte Szene, Rendering auf Textur usw., aber ich denke, wir können davon ausgehen, dass es die meiste Zeit so funktioniert, oder? Der "Group by Shader" -Ansatz ist gut, da das Wechseln von Shadern eine teure Operation ist.

Von einer Seite können Sie nicht zu viele Shader haben, da Sie die Szene schnell rendern möchten. Auf der anderen Seite benötigen Sie viele verschiedene Shader (oder Uber-Shader mit Zweigen - ziemlich ähnlich) für Haut, Metall, Wasser usw.

Wie viele (und welche) unterschiedlichen Shader würde das theoretische, moderne 3D-Detektivspiel für PC (DirectX 11, wenn es darauf ankommt) für Dritte verwenden? Es wären 5, 20 oder mehr wie 100 aktive Shader, die bei einem "Frame X" nur aktiv zählen? Ich weiß, dass es nicht nur eine Zahl ist, aber ich frage mich, welche Größenordnung und Faktoren für ein PC-Spiel wichtig sind.


In meinem Beispielspiel würde ich ungefähr 9-11 pro Frame verwenden (zähle es als verschiedene, kleine Shader oder einen Über-Shader - spielt jetzt keine Rolle):

  1. Skin Shader
  2. Lidschatten (nicht zu viel? Aber sie sind unterschiedlich)
  3. Metal Shader
  4. Ground Shader
  5. Schnee / Regen Shader (falls erforderlich)
  6. Water Shader (falls das Wasser in der Szene vorhanden ist)
  7. Glow-Shader (nur bei einigen Spezialeffekten)
  8. Lichtsender Shader (Straßenlaternen etc.)
  9. Standard-Shader (für alle anderen nur Standard-Shading)
  10. Standard-Shader mit normalen Maps
  11. 2D Shader (für GUI etc.)

Ist es "viel" oder "nicht viele"? Habe ich einige wichtige Shader vergessen, die ich brauchen würde?

PolGraphic
quelle

Antworten:

28

Es kommt wirklich auf die Technik an. In einem Forward-Rendering haben Sie häufig einen Shader für jeden unterschiedlichen Materialtyp. In AAA-Spielen, die diese Technik verwenden, werden Shader häufig aus einer Reihe von Optionen für das Material generiert, das ein Künstler festlegen kann. Dies kann zu Hunderten von Shadern führen (1). Nehmen wir aber an, die Anzahl der Shader liegt im Allgemeinen in der Größenordnung von 40

In einem verzögerten Shading / Rendering codieren Sie häufig den Materialtyp im G-Buffer und verwenden später einen großen Shader, um verschiedene Materialtypen korrekt und unterschiedlich zu rendern. Dies führt zu viel weniger, aber komplizierteren Shadern. Nehmen wir an, die Anzahl der Shader liegt hier in der Größenordnung von 5.

(1) Quelle: Ich habe für einen Auftragnehmer von Crystal Dynamics gearbeitet und dort ein Tool entwickelt, um die Anzahl der generierten Shader für Tomb Raider zu reduzieren, da die automatische Generierung aus dem Ruder läuft. Ziel war es, die Anzahl der Shader auf 40 oder so etwas zu reduzieren.

Roy T.
quelle
2
Vielen Dank für Ihre Antwort - es war ziemlich komplex und reichhaltig. Ich habe gerade abgestimmt. Trotzdem werde ich ein paar Tage warten, bis das Markieren abgeschlossen ist, da es sich um eine ziemlich "offene" Frage handelt - vielleicht kann jemand anderes aus eigener Erfahrung noch etwas hinzufügen. Nochmals
vielen
s / less / less / ...
Fehler
3

Ich weiß, dass Sie eine Antwort für PC wollten. Aber ich antworte für das, was ich in iOS mache und erwarte nicht, dass ich dein Häkchen bekomme.

Sie haben anscheinend die richtige Idee. Es wird jedoch für jede App anders sein. Am Ende geht es darum, alles zu tun, um die gewünschte Bildrate zu erhalten. Auf dem iPhone ist meine Zielrate 60. Ich mag es nicht, wenn sie unter 30 sinkt. Wenn ich eine Explosion mit mehreren hundert animierenden Partikeln auf Spritebasis habe, sinkt sie auf 30 auf dem iPhone5 und viel niedriger auf dem 4. Also Ich muss Entscheidungen über die Reduzierung der Komplexität auf bestimmten Geräten treffen. Und manchmal wirkt sich diese Entscheidung auf Shader aus.

Im Allgemeinen hat dies jedoch keinen Einfluss auf die Anzahl der Shader, sondern darauf, welche Shader ich basierend auf meinem Ziel für die Framerate für eine Aufgabe verwende.

Meiner Meinung nach erhöhen Shader bei korrekter Verwendung die Framerate. Ich habe eine App mit 80 Shadern, aber sie verwendet nicht alle in einem einzigen Frame - wahrscheinlich um die 10. Und sie werden nach Bedarf kompiliert und zwischen den Szenen verworfen. Und auf meiner Hardware habe ich die Framerate des Shader-Count-Effekts nicht gesehen. Nur die im Shader verwendeten Techniken. Ich denke jedoch, dass die Verwendung von zwei ähnlichen Shadern für die Framerate besser ist als eine komplexere, die verzweigt.

Ich habe auch Shader, die die Qualität verringern, wenn das Rendern langsam ist oder auf einem langsameren Gerät. Ich verwende eine normale Zuordnung auf dem iPhone 5, tausche aber den Shader gegen einen aus, der keine normale Zuordnung auf dem iPhone 4 ausführt.

Ich mag Roys Antwort und ich versuche immer, einen Einblick zu bekommen, wie "echte" Spiele hergestellt werden. Da ich Autodidakt bin, weiß ich nie, ob meine große Entdeckung des Tages nur darin besteht, wie es allgemein gemacht wird, oder immer noch ein paar Schritte hinter den echten Profis.

Badweasel
quelle
1
Kein Problem mit der Tatsache, dass Ihre Antwort "ist für iOS". Ich sagte über PC hauptsächlich, weil ich vermeiden möchte, dass "es von der Plattform abhängt", kurze Antworten;) Vielleicht ist Ihre Antwort nicht 100% für mich. Trotzdem hat es einige plattformunabhängige Schlussfolgerungen und ich fand es gut. Und andere Mitglieder der Community (die iOS verwenden) mögen es sogar noch nützlicher finden, also danke und
stimme für
1

Sie können nicht wirklich angeben, wie viele Shader Sie haben sollten oder nicht, da dies von den begrenzenden Faktoren Ihres Spiels sowie von der Zielplattform abhängt. In der Praxis sollten Sie die Anzahl der aktiven Shader auf "nur so viele, wie Sie tatsächlich benötigen" reduzieren. Manchmal bedeutet dies, dass Sie nur eine Handvoll Shader (ungefähr 10) auf einmal haben, und manchmal bedeutet dies, dass Sie ein paar Dutzend haben.

Eine Möglichkeit, die Anzahl der in Ihrem Spiel auftretenden Permutationen zu begrenzen, ist die Implementierung der "Ubershader" -Technik, bei der fast jeder Shader von einem singulären Shader abgeleitet wird und die Unterschiede und besonderen Verhaltensweisen über einen Präprozessor ausgetauscht werden. Es gibt natürlich Ausnahmen für Spezialeffekte wie Schärfentiefe, Umgebungsokklusion und so weiter.

Meine bisherigen Erfahrungen mit AAA-Spielen haben gezeigt, dass ein paar Dutzend aktive Shader nicht unangemessen sind.

Evan
quelle