Il existe de nombreuses façons de fournir des shaders Metal avec une bibliothèque statique, toutes avec des compromis différents. Je vais essayer de les énumérer ici.
1) Transformez vos fichiers .metal en chaînes statiques qui sont cuites dans votre bibliothèque statique.
Ceci est probablement la pire option. L'idée est de prétraiter votre code Metal Shader en chaînes qui sont incluses en tant que littéraux de chaîne dans votre bibliothèque statique. Vous utiliserez ensuite l'API newLibraryWithSource:options:error:
(ou son frère ou sa sœur asynchrone) pour transformer la source en MTLLibrary
et récupérer les fonctions. Cela vous oblige à concevoir un processus pour effectuer la conversion .metal
-to-string, et vous perdez l'avantage de la précompilation des shaders, ce qui rend l'application résultante plus lente.
2) fichiers à côté de votre bateau .Complexe métallique bibliothèque statique et exigent que les utilisateurs bibliothèque pour les ajouter à leur application cible
Tout bien considéré, c'est une option décente, mais il place un fardeau plus lourd sur vos utilisateurs et expose votre source Metal Shader (si c'est un problème). Code dans votre bibliothèque statique peut utiliser la "bibliothèque par défaut" (newDefaultLibrary
), puisque le code sera automatiquement compilé par Xcode dans default.metallib
de l'application, qui est incorporée dans le regroupement d'applications en tant que ressource.
3) Expédier un fichier .metallib à côté de votre bibliothèque statique
Ceci est un bon compromis entre la facilité d'utilisation, les performances et la sécurité (car il ne pas exposer votre source de shaders, que son IR). Fondamentalement, vous pouvez créer une cible "Metal Library" dans votre projet, dans laquelle vous mettez votre code shader. Cela va produire un fichier .metallib
, que vous pouvez envoyer avec votre bibliothèque statique et faire en sorte que votre utilisateur soit incorporé en tant que ressource dans la cible de l'application. Votre bibliothèque statique peut charger le .metallib
à l'exécution avec l'API ou newLibraryWithURL:error:
. Étant donné que vos shaders seront précompilés, la création de bibliothèques sera plus rapide et vous conserverez l'avantage des diagnostics de compilation.
Content que vous ayez trouvé une approche qui vous convient. Pour la postérité, j'ai commenté ci-dessous et partagé un projet de preuve de concept qui vous permet de conserver l'avantage de la pré-compilation des shaders tout en n'envoyant qu'un seul fichier. Si je faisais cela en production, c'est presque certainement l'approche que je prendrais. – warrenm