Soll ich Shader in kompilierter Form oder in Klartext verteilen?

13

Was ist die beste Strategie für die Verbreitung in der realen Welt sowie für Desktop und Mobile, wenn eine Anwendung Shader verwendet, die in GLSL geschrieben wurden?

Ich versuche, dies in binärer Form oder als normaler serialisierter Text zu verbreiten. Ich hätte gerne einen guten Vorschlag dazu.

user827992
quelle

Antworten:

15

Der Hauptgrund für die Verwendung von Binärshadern liegt darin, dass das Kompilieren der Textshader für Ihr Zielgerät zu aufwändig ist. Binäre GLSL-Shader haben kein standardisiertes Format, daher benötigen Sie für jede GPU / jeden Treiber, den Sie unterstützen möchten, andere. Ich würde empfehlen, dass Sie die Shader in Quellform verteilen und sie dann beim ersten Start in Binärform zwischenspeichern und anschließend von dort laden. Andererseits würde ich zuerst testen, ob Sie dort wirklich einen Leistungsengpass haben, um die Verwendung der Binärdateien überhaupt zu rechtfertigen.

Eine Sache, die Sie berücksichtigen sollten, ist auch ein Offline-Text-Shader-Optimierer , der mit beschissenen mobilen Shader-Compilern eine große Wirkung erzielen kann.

Tapio
quelle
Eigentlich wäre ich überrascht, wenn Sie ein Gerät finden könnten, bei dem die Shader-Kompilierung einen Engpass darstellt. Die Menge an Code, auch in großen Shadern, ist in Bezug auf die Kompilierung eine unbedeutende Menge an Code.
edA-qa mort-ora-y
1
Die großen Engines da draußen kompilieren Shader normalerweise offline und / oder speichern sie beim ersten Start im Cache, wie Tapio vorschlägt. Vielleicht gibt es eine unbedeutende Menge an Code pro Shader, aber Sie können viele davon haben.
Laurent Couvidou
muss ich also eine zufällige ATI-Videokarte und eine andere zufällige von Nvidia kaufen, meine Shader kompilieren und nur die kompilierte Version verteilen? Wie kann ich zur Laufzeit überprüfen, welche Marke die Grafikkarte hat? Gibt es etwas zuverlässiges dafür?
User827992
1
@ user827992 Das Binärformat kann für verschiedene Generationen von GPUs / Treibern unterschiedlich sein, auch wenn der Hersteller identisch ist. Und vergessen Sie nicht, dass es auch viele Intel-GPUs gibt, geschweige denn alle mobilen wie Qualcomm und PowerVR. Also nochmal: Ich schlage vor, Sie verteilen keine kompilierten Shader, sondern zwischenspeichern sie beim ersten Start auf dem Gerät des Benutzers. In Bezug auf die GPU-Erkennung können Sie versuchen, die Zeichenfolgen GL_VENDOR, GL_VERSION und GL_RENDERER aus glGetString () zu analysieren. Ihr Format ist jedoch von Hersteller zu Hersteller unterschiedlich.
Tapio