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?
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle