Les nouveautés de Metal 3 : MSL 1.3, HUD, MetalFX, Shader Converter...
- 👨 Alban Martin
- Il y a 1 an
- 💬 Réagir
Metal 3, dont la première version a été introduite en 2022, représente une amélioration significative du moteur et des frameworks Metal pour l'écriture de jeux 3D pour les plates-formes Apple. Il s'agit d'un article à destination des développeurs de jeux.
C'est quoi Metal ?
Comme l'explique Apple sur la page officielle, Metal permet l'accélération matérielle des graphismes sur les plateformes Apple en fournissant une API à faible coût, un langage d'ombrage riche, une intégration étroite entre les graphismes et le calcul, ainsi qu'une suite inégalée d'outils de profilage et de débogage du GPU. Vos jeux et applications professionnelles peuvent tirer pleinement parti des performances et de l'efficacité incroyables du silicium d'Apple sur l'iPhone, l'iPad, le Mac et l'Apple TV. Cette année, la nouvelle boîte à outils de portage de jeux facilite plus que jamais le transfert de jeux d'autres plateformes vers Mac, et le convertisseur de shaders Metal simplifie considérablement le processus de conversion des shaders et du code graphique de votre jeu.
Et MetalFX ?
En 2020, Apple a annoncé qu'il avait porté Metal sur les processeurs et GPU Apple Silicon pour fournir des performances beaucoup plus rapides. Lors de la WWDC 2022, Apple a introduit une nouvelle fonctionnalité dans Metal appelée MetalFX.
MetalFX permet un rendu de scène plus rapide et plus précis en recalculant et en anticrénelant certaines images pour recalculer et lisser les bords des objets rendus.
L'arme secrète de MetalFX est une technologie appelée upscaling qui permet d'améliorer la résolution d'une image à la volée. Ainsi, un moteur de rendu peut générer une image en 1080p par exemple, et l'API bas niveau MetalFX va la redimensionner en 4K avant de l'afficher à l'utilisateur. Cela permet des calculs 3D plus rapides et une bande-passante plus faible. C'est une technique notamment utilisée pour le streaming des jeux du côté de Nvidia ou de Sony.
Metal Shading Language Specification 1.3
Metal possède son propre langage basé sur C++14, Metal Shading Language, qui est entièrement détaillé dans la spécification du langage de shader de Metal (MSL).
Lors de la WWDC 23, Apple a présenté la version 1.3 de la spécification du langage Metal Shading. La spécification MSL couvre tous les aspects de l'écriture du code de shader pour Metal en C++.
Metal 3 inclut désormais un petit affichage tête haute (HUD) en option visible dans le coin supérieur droit des scènes rendues au fur et à mesure que votre jeu s'exécute.
Le Performance HUD peut afficher plusieurs informations utiles pour inspecter les performances de votre jeu en temps réel :
Outil de conversion de Metal Shader
Lors de la WWDC 2023, Apple a également présenté l'outil Metal Shader Converter. Les shaders sont de petits algorithmes qui gèrent la lumière, la couleur et les matériaux sur les objets 3D d'une scène.
Metal Shader Converter vous aide à convertir des shaders écrits dans d'autres langages et frameworks ou à partir d'autres plates-formes vers Metal 3 - à savoir à partir du format DirectX 12 DXIL de Microsoft Windows.
Metal Shader Converter propose deux modèles de liaison parmi lesquels choisir : mise en page automatique et mise en page explicite. Ces modèles aident à convertir les shaders d'autres plates-formes.
Les tables MTLBuffer sont utilisées dans l'outil Metal Shader Converter.
Bindless Rendering, argument tampon et ray tracing
Autre changement dans Metal 3 version 2, le bindless rendering (rendu sans liaison) vous permet d'utiliser le ray-tracing pour améliorer les performances et la qualité des scènes rendues en 3D. La rumeur veut que le ray-tracing soit de la partie sur l'iPhone 15 Pro.
Un aspect du bindless rendering - les tampons d'arguments - vous permet de combiner des ressources dans des tampons qui accélèrent le rendu.
Au lieu de lier chaque ressource d'affichage, avec des tampons d'argument, les ressources sont liées ensemble en mémoire dans un tampon. Dans le modèle sans liaison, les tampons d'arguments agrègent et relient les ressources permettant un accès direct à partir des pipelines de rendu.
Les maillages 3D sont liés entre eux en mémoire au lieu d'être utilisés un par un dans les pipelines de rendu. Cela accélère l'accès à tous les objets nécessaires aux shaders de lancer de rayons pour rendre les surfaces haute résolution plus rapidement et avec plus de détails.
Quatre nouvelles améliorations dans Metal 3 facilitent le rendu sans lien :
- Tampons d'arguments - relient les ressources entre elles pour un accès direct comme décrit ci-dessus.
- Tableaux illimités - permet la définition de plusieurs structures de maillage dans un tableau à la fois. Les shaders peuvent accéder à des tableaux de n'importe quelle taille sans contraintes.
- Les objets de structure de maillage dans des tableaux illimités sont désormais accessibles directement à partir du code et des threads C/C++, bien que vous deviez faire preuve de prudence lorsque vous y accédez en raison de problèmes de synchronisation des threads.
- Vous pouvez utiliser l'indicateur de précompilateur __METAL_VERSION__ pour compiler de manière conditionnelle les déclarations C, C++ et Mesh dans Metal 3 afin d'utiliser des tableaux illimités, s'ils sont disponibles sur la plate-forme cible.
MTLDevice
Vous pouvez utiliser l'objet MTLDevice lors de l'exécution pour voir si un périphérique donné prend en charge les nouvelles fonctionnalités. Pour utiliser les nouvelles fonctionnalités, vous devez disposer d'un appareil avec les spécifications suivantes :
- iOS - Puce A13 Bionic ou plus récente.
- macOS - Un Mac 2016 ou supérieur.
Structures d'accélération allouées par MTLHeap
Les "heaps" sont des espaces mémoire pré-alloués dans lesquels les ressources et les structures sont chargées avant le rendu. Le fait d'être résident dans le "heap" signifie que les ressources sont préchargées et prêtes à être utilisées instantanément lorsque cela est nécessaire pendant le rendu.
Les structures d'accélération du ray-tracing peuvent être allouées directement à partir d'objets MTLHeap avec des tampons et des textures. Cela permet l'agrégation avec d'autres types de ressources. L'utilisation des structures d'accélération MTLHeap permet d'économiser du temps CPU dans les threads.
Améliorations de la validation des shaders
En règle générale, les ressources doivent résider dans le "heap" avant le rendu pour garantir des performances de rendu et un affichage précis. Le fait de ne pas allouer les ressources en "heaps" à l'avance peut entraîner des problèmes de performances et même un affichage incorrect des objets pendant le dessin.
Pour aider à garantir que les ressources sont bien présentes, Metal 3 fournit une nouvelle fonctionnalité pour détecter la résidence manquante lors de l'exécution du tampon de commande partagé. Pour garantir la résidence du "heap", "useResource:" est désormais envoyé à chaque élément d'une scène avant que les objets de la scène ne soient envoyés à l'encodeur de ray-tracing.
Cette forme d'assurance que les ressources sont résidentes avant l'exécution des shaders de ray-tracing est appelée validation de shader dans Metal 3.
Visionneuse de dépendances du débogueur de Metal
La nouvelle visionneuse de dépendances de Metal Debugger affiche les dépendances entre les ressources de charge de travail de rendu.
Une fois le debugger ouvert, un graphique de dépendance apparaîtra qui montre les dépendances dans chaque commande de rendu. Cliquer sur n'importe quel élément dans un graphique de dépendance affiche les détails de cet élément dans la nouvelle barre latérale à droite de la visionneuse de dépendances.
Il existe deux types de dépendances affichées dans la visionneuse de dépendances de Metal Debugger : le flux de données et la synchronisation. Les lignes pleines dans la visionneuse de dépendances montrent le flux de données et les lignes pointillées montrent les dépendances qui montrent la synchronisation entre les passages.
Débogueur de shader
Il existe également un "Shader Debugger" intégré à Xcode 14 et versions ultérieures qui vous permet d'effectuer un débogage au niveau des pixels de votre code de shader. Vous pouvez sélectionner n'importe quel pixel rendu affiché dans n'importe quelle scène, cliquez sur le bouton Shader Debugger dans le coin inférieur droit de la fenêtre du débogueur et il sautera à l'endroit exact dans votre code de shader utilisé pour dessiner l'objet.
Améliorations diverses
L'équipe Metal propose désormais quatre recommandations supplémentaires pour optimiser les pipelines de rendu Metal :
- Déplacez les copies avant le rendu.
- Regroupez les commandes du même type.
- Évitez les encodeurs vides.
- Optimiser avec MTLLoadAction et MTLStoreAction
- La dernière recommandation — MTLLoadAction et MTLStoreAction — est utilisée sur les pièces jointes, actions à exécuter avant une passe de rendu.
C'est maintenant aux développeurs de jouer. Les premiers titres tirant partie de Metal 3 sont disponibles sur Mac notamment, avec Résident Evil Village et autre No Man's Sky, mais Apple fait le pari que de nombreux titres AAA vont arriver en 2023 et en 2024. Vous aimeriez quels jeux ?