Verliere / gewinne ich Leistung beim Verwerfen von Pixeln, auch wenn ich keine Tiefenprüfung verwende?

22

Als ich zum ersten Mal nach Anweisungen zum Verwerfen gesucht habe, habe ich Experten gefunden, die sagten, die Verwendung von Verwerfen würde zu Leistungseinbußen führen. Sie sagten, dass das Verwerfen von Pixeln die Fähigkeit der GPU, zBuffer richtig zu verwenden, beeinträchtigt, da die GPU zuerst Fragment Shader für beide Objekte ausführen muss, um zu prüfen, ob das der Kamera nähere Objekt verworfen wird oder nicht. Für ein 2D-Spiel, an dem ich gerade arbeite, habe ich sowohl den Tiefentest als auch das Tiefenschreiben deaktiviert. Ich zeichne alle Objekte nach ihrer Tiefe sortiert und das ist alles, keine Notwendigkeit für die GPU, ausgefallene Dinge zu tun. Jetzt frage ich mich, ob es immer noch schlecht ist, wenn ich Pixel in meinem Fragment-Shader verwerfe.

Ali1S232
quelle

Antworten:

20

Grafikhardware kann Fragmente vor der Berechnung ihres Farbwerts frühzeitig tiefenbasiert aussortieren (mit anderen Worten, bevor der Fragment-Shader ausgeführt wird). Wenn Sie Funktionen verwenden, die sich darauf auswirken, z. B. discardAlphatests oder Manipulationen gl_FragDepthder Hardware, wird diese Optimierung beeinträchtigt, da die tatsächliche Tiefe des Fragments nicht angenommen werden kann und der vollständige Shader ausgeführt werden muss.

Ob die Verwendung einer dieser kompromittierenden Funktionen eine beobachtbare Nettoauswirkung auf die Leistung hat, hängt jedoch von der jeweiligen Situation ab. Die Early-Z-Optimierung kann die Leistung verbessern, wenn Sie zum Beispiel sehr teure Fragment-Shader haben, aber wenn die Kosten Ihrer Pipeline im Vertex-Shader (oder anderswo) liegen, profitieren Sie weniger davon und sehen möglicherweise wenig oder keine Leistungsminderung durch Verwendung von discard.

Das Deaktivieren des Tiefen-Tests vollständig über die API sollte verhindern, dass die Optimierung ebenfalls ausgeführt wird, da dies zu falsch gerenderten Szenen führen kann. In Ihrem Fall sollte es also egal sein, dass Sie verwenden discard.

Neuere Hardware kann die Tests (einschließlich früherer Schablonentests) erzwingen. layout(early_fragment_tests)Weitere Informationen (und Vorbehalte) dazu finden Sie auf der Seite, die ich am Anfang der Antwort verlinkt habe.

Josh
quelle
3

Wie immer bei Leistungsfragen ist die genaueste Antwort, sie auf Ihrer Zielhardware auszuprobieren und zu messen, was passiert.

In deinem Fall ist es wahrscheinlich keine schlechte Sache. Tatsächlich besteht die Möglichkeit, dass die Leistung durch Einsparung von Speicherbandbreite verbessert wird. Es werden jedoch auch Shader-Anweisungen hinzugefügt, sodass dies nicht immer einen Leistungsvorteil darstellt.

Selbst wenn der Tiefenpuffer verwendet wird, ist der Leistungseinbruch nicht immer sehr bedeutend, wenn Sie mit der Reihenfolge, in der Sie die Objekte zeichnen, vorsichtig sind.

Unter https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ finden Sie einen Blogbeitrag , in dem detailliert beschrieben wird, wie frühe Tiefenprüfungen funktionieren können in der Hardware und welche Einschränkungen es geben könnte.

Adam
quelle
1
Eigentlich denke ich, dass es nach dem Testen sicher ist, anzunehmen, dass ich weder Leistung verliere noch zunehme, aber ich habe nach einer Antwort gesucht, die ausführlich erklärt, was und warum passieren wird.
Ali1S232