Warum ist die programmierbare Pipeline (GLSL) schneller als die feste Pipeline?

27

Ich unterrichte mich selbst in GLSL und versuche herauszufinden, warum es wahrscheinlich schneller ist als die feste Funktionspipeline.

Der Grund, warum ich ein Problem habe, ist, dass die von Ihnen erstellten Shader meines Wissens Abschnitte der Pipeline ersetzen, die zuvor vorhanden waren. Wie kann man also einfach eine eigene Version bereitstellen, um die Dinge zu beschleunigen?

Das Einzige, was ich mir vorstellen kann, ist, wenn Sie zuvor versucht haben, Ihre eigene Beleuchtungsgleichung anzugeben, müssten Sie die Berechnung auf der CPU durchführen, aber jetzt können Sie die Berechnungen auf der GPU durchführen, die schneller sein wird.

Verstehe ich das richtig?

Joey Green
quelle
Fragen Sie sich, ob es schneller ist, Ihre eigenen Versionen der vorhandenen Funktionen zu erstellen, oder ob es schneller ist, Funktionen, die Sie auf der CPU berechnet haben, auszulagern?
MichaelHouse
Ich habe auf gamedev.net einen Beitrag gefunden, der meine Fragen beantwortet.
Joey Green
2
Aha. Sie sollten hier eine Antwort darauf posten, damit andere davon profitieren können. Vielleicht klären Sie Ihre Frage dabei.
MichaelHouse
@ joey-green würdest du bitte das gamedev.net hier verlinken . Ich wäre hilfreich für Leute, die über diese Frage stolpern werden.
Quazi Irfan
1
Um die Sache noch mehr zu verwirren: In meinen Tests ist die feste Pipeline möglicherweise schneller als Shader, zumindest in einfachen Fällen. siehe sol.gfxile.net/instancing.html
Jari Komppa

Antworten:

27

Von Ihnen erstellte Shader werden nicht Ihre eigene Version der Fixed-Function-Pipeline (FFP) sein, sondern benutzerdefinierte Vertex- und Pixel-Manipulationsoperationen, um etwas Cooles und Komplexes zu erzielen.

Viele Dinge, die Sie über eine programmierbare Pipeline (PP) ausführen, funktionieren schneller als ihre möglichen FFP-Implementierungen, da PP die Anzahl der Durchläufe oder die Menge an Combiner- und Cubemap-Magie reduziert, die erforderlich sind, um diese hypothetischen Dinge in FFP zu rendern.

Stellen Sie sich vor, Sie implementieren eine häufig vorkommende Funktion wie die pixelgenaue Beleuchtung in FFP, wobei Sie nur interpolierte Scheitelpunktdaten und eine Beispieltextur in Ihren Händen haben. Es ist nicht einmal möglich, es "ehrlich" zu machen, sondern nur Hacks für spezielle Fälle, abhängig von getreuen vorberechneten Cubemaps und einigen ernsthaften Überblendungen. Bei PP geht es darum, ein Punktprodukt zwischen Lichtrichtung und Scheitelpunktnormal zu färben.

Alles in allem verwandelt sich PP langsam und unmöglich in schnell und möglich. Wenn Sie sich jedoch dazu entschließen, einen Shader zu schreiben, um dieselben in FFP verwendeten Algorithmen zu implementieren, werden Sie feststellen, dass FFP etwas schneller ist, da es sehr hardwareoptimiert ist.

Genug Tee
quelle
1
Schöne Antwort ... +1.
Amir Zadeh
@Green Da bin ich mir nicht sicher. Verpasst den Punkt irgendwie. Kylotans Antwort ist für die eigentliche Frage viel passender.
Chris sagt Reinstate Monica
14

Theoretisch ist die programmierbare Pipeline langsamer als die Pipeline mit festen Funktionen. Kein Universalprozessor kann mit einem Spezialprozessor mithalten. Die ursprüngliche Pipeline mit festen Funktionen bestand aus kaum mehr als ein paar logischen Gattern in einer Linie, die so schnell wie theoretisch möglich war.

Heutzutage ist die programmierbare Pipeline jedoch die Norm. Die Hardware ist also auf die programmierbare Pipeline ausgerichtet. Nachdem der anfängliche Wirkungsgrad einer Schaltung, die speziell für einen bestimmten Datenfluss erstellt wurde, verloren gegangen ist, muss er dem gängigsten Fall gerecht werden, nämlich dem Shader-basierten Ansatz. Für Abwärtskompatibilitätsoptionen wird die feste Funktionspipeline jedoch weiterhin zur Verfügung gestellt - die Kosten bestehen jedoch darin, dass die alten festen Funktionen in Shader übertragen werden müssen, was durchaus Kosten verursachen kann. Dies würde den Leistungsunterschied erklären.

Kylotan
quelle
1

Der Hauptgrund, an den ich denken könnte, ist eine Phase in der festen Pipeline, die Ihr Programm nicht benötigt. Wenn Sie beispielsweise ein Spiel erstellen, in dem alle Lichter statisch sind, können Sie problemlos einen Shader implementieren, der nicht einmal versucht, das dynamische Licht zu berechnen. In diesem Fall wird der Shader schneller ausgeführt als ein vorkompilierter Shader, der einige Gleichungen auf dynamisches Licht überprüft (ein Allzweck-Shader). Es gibt auch andere Beispiele. Sie können sich leicht viele Aspekte überlegen, die für eine feste Pipeline in Betracht gezogen werden sollten, aber Sie können die Implementierung in Ihren eigenen GLSL-Codes ignorieren.

Ali1S232
quelle
1

Genau das ist es, Ihre Shader ersetzen Teile der Pipeline. Häufig sind Ihre Shader jedoch auf einen bestimmten Effekt spezialisiert, den Sie erzielen möchten, und verarbeiten nicht alle möglichen Sonderfunktionen, die aktiviert werden können. Sie sind daher einfacher als ein Shader, der die gesamte Pipeline mit festen Funktionen emuliert. Während der Pfad mit festen Funktionen viele Dinge und OpenGL-Funktionen berücksichtigen muss, die Sie möglicherweise nicht verwenden möchten (oder von denen Sie noch nicht einmal gehört haben).

Und die Zeiten, in denen Sie die Festfunktion in Spezialhardware (im Gegensatz zu einer voll programmierbaren Hardware) ausführen ließen, sind vorbei. Wenn Sie die Festfunktionspipeline verwenden, passiert wahrscheinlich, dass Ihr Treiber nur seine eigenen Spezialshader lädt, die die implementieren Pfade mit festen Funktionen. Diese können jedoch sehr komplex sein, um alle Funktionen der Pipeline mit festen Funktionen bereitzustellen.

Chris sagt Reinstate Monica
quelle
"Wenn Sie die Festfunktions-Pipeline verwenden, wird Ihr Treiber wahrscheinlich nur seine eigenen speziellen Shader laden, die die Festfunktionspfade implementieren." ..sind Sie sicher? Können Sie bitte eine zuverlässige Ressource bereitstellen? Vielen Dank.
Quazi Irfan
@iamcreasy Ich habe keine zuverlässige Quelle (daher die wahrscheinlich), muss ich zugeben. Ich bezweifle jedoch stark, dass die Grafikkarten von heute (bei denen es sich nur um ein Bündel kleiner Prozessoren handelt) noch dedizierte Hardware für die Berechnung von Beleuchtung oder Nebelberechnungen besitzen. Stattdessen laden sie wahrscheinlich nur vorkompilierte Programme für diese in die spezifischen Shader-Stufen (ob diese vom Treiber oder von einem ROM-Speicher stammen, weiß ich nicht).
Chris sagt Reinstate Monica
@iamcreasy laut nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , feste Pipeline wurde in GeForce 6xxx entfernt.
Dirty Ice
"Wenn Sie die Festfunktions-Pipeline verwenden, wird Ihr Treiber wahrscheinlich nur seine eigenen speziellen Shader laden, die die Festfunktionspfade implementieren." Wahr. "Diese können jedoch sehr komplex sein, um alle Funktionen der Festfunktions-Pipeline bereitzustellen." Ein guter Treiber generiert Shader nur für die von Ihnen aktivierten Funktionen.
Chris