Dois-je distribuer des shaders sous forme compilée ou en texte brut?

13

Ayant une application qui utilise des shaders qui ont été écrits en GLSL, quelle est la meilleure stratégie pour la distribution dans le monde réel et pour le bureau et le mobile?

Je vise à distribuer cela sous forme binaire ou sous forme de texte sérialisé simple, je voudrais une bonne suggestion à ce sujet.

user827992
la source

Réponses:

15

La principale raison d'utiliser des shaders binaires est que la compilation des shaders de texte représente une charge de travail trop importante pour votre appareil cible. Les shaders GLSL binaires n'ont pas de format standardisé, vous aurez donc besoin de différents pour chaque GPU / pilote que vous prévoyez de prendre en charge. Je vous recommande de distribuer les shaders sous forme source, puis lors de la première exécution, de les mettre en cache sous forme binaire et de les charger ensuite à partir de là. Là encore, je testerais d'abord si vous avez vraiment un goulot d'étranglement en termes de performances pour justifier l'utilisation des binaires.

Une chose à considérer est également un optimiseur de shader de texte hors ligne qui peut avoir un grand effet avec les compilateurs de shader mobiles merdiques.

Tapio
la source
Je serais en fait surpris si vous pouviez trouver n'importe quel appareil où la compilation de shaders est un goulot d'étranglement. La quantité de code, même dans les grands shaders, est une quantité insignifiante de code en termes de compilation.
edA-qa mort-ora-y
1
Les gros moteurs compilent généralement des shaders hors ligne et / ou les mettent en cache lors de la première exécution, comme le suggère Tapio. Il y a peut-être une quantité insignifiante de code par shader, mais vous pouvez en avoir beaucoup .
Laurent Couvidou
donc je dois acheter une carte vidéo ATI aléatoire et une autre aléatoire de Nvidia, compiler mes shaders et distribuer uniquement la version compilée? Comment puis-je vérifier à l'exécution quelle est la marque de la carte vidéo ciblée? Il y a quelque chose de fiable pour ça?
user827992
1
@ user827992 Le format binaire peut être différent pour différentes générations de GPU / pilotes même si le fournisseur est le même. Et n'oubliez pas qu'il y a aussi beaucoup de GPU Intel, et encore moins tous les mobiles, comme Qualcomm et PowerVR. Encore une fois: je vous suggère de ne pas distribuer de shaders compilés, mais plutôt de les mettre en cache lors de la première exécution sur l'appareil de l'utilisateur. En ce qui concerne la détection de GPU, vous pouvez essayer d'analyser les chaînes GL_VENDOR, GL_VERSION et GL_RENDERER sous glGetString (), mais leur format varie d'un fournisseur à l'autre.
Tapio