Que recherchez-vous ?
Engine & platform

Expérimenter avec le Shader Graph : Faire plus avec moins

RINALDO TJAN / UNITY TECHNOLOGIESContributor
Feb 25, 2021|12 Min
Expérimenter avec le Shader Graph : Faire plus avec moins
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Vous pouvez améliorer l'efficacité d'exécution de votre shader sans sacrifier la qualité de vos graphiques en regroupant les informations matérielles du rendu physique (PBR) dans une seule carte de texture et en les superposant dans un shader compact. Découvrez cette expérience.

Cette expérience fonctionne à la fois dans le pipeline de rendu universel (URP) et dans le pipeline de rendu haute définition (HDRP). Pour tirer le meilleur parti de cet article, vous devez être familiarisé avec le Shader Graph. Si vous ne connaissez pas Shader Graph, vous pouvez consulter nos ressources pour une introduction et plus de détails sur cet outil de création visuelle de shaders.

Lorsque l'on travaille avec des ressources artistiques dans un environnement de type terrain, il est généralement préférable d'utiliser plusieurs couches de matériaux à carreler, car elles permettent d'obtenir de meilleurs résultats en matière de mélange. Toutefois, le coût des performances du GPU lié aux multiples échantillons de texture et à l'augmentation de l'utilisation de la mémoire à chaque couche ajoutée au nuanceur peut être prohibitif pour certains appareils et inefficace en général.

Avec cette expérience, j'ai cherché à :

  • Faire plus avec moins
  • Minimiser l'empreinte mémoire et faire preuve de parcimonie dans l'échantillonnage des textures lors de la représentation d'un matériau PBR
  • Minimiser les instructions de shaders
  • Effectuer des mélanges de couches avec un minimum de canaux de couleur splat map/vertex
  • Extension des fonctionnalités de la carte des éclaboussures et de la couleur des vertex pour plus de confort et d'efficacité

Si l'expérience a atteint ses objectifs, elle s'accompagne néanmoins de quelques mises en garde. Vous devrez fixer vos priorités en fonction des exigences de votre propre projet pour déterminer quels compromis sont acceptables pour vous.

1. Matériau PBR à texture unique

Avant de procéder à la stratification, la première chose à faire est de déterminer le conditionnement du matériau PBR. Le matériau PBR est généralement fourni avec les paramètres d'albédo (couleur de base), de masque de lissage, d'occlusion ambiante, de métallicité et de normalité.

En général, les cinq cartes sont représentées par trois cartes de texture. Pour minimiser l'utilisation des textures, j'ai décidé de sacrifier le Metalness et l'Ambient Occlusion pour cette expérience.

Les autres cartes - albédo, douceur et définition normale - sont traditionnellement représentées par au moins deux cartes de texture. La réduction à une seule carte nécessite un prétraitement de chaque canal individuel.

Matériau PBR avec texture

Le résultat final du matériau PBR est regroupé dans une texture unique. Rouge = dHdu (hauteur des dérivées par rapport à la direction U) pour la définition normale#. Vert = dHdv (hauteur des dérivées par rapport à la direction V) pour la définition normale#. Bleu = Nuance de gris linéaire représentant l'albédo (couleur reconstruite dans le nuanceur). Alpha = Carte de lissage linéaire (carte de lissage standard). Remarque : La texture est importée dans Unity avec le paramètre sRGB décoché et compressée au format BC7. Lors du portage sur d'autres plates-formes, il convient d'adopter le format de texture équivalent à 4 canaux supporté par la plate-forme.

Traitement des cartes

Albedo

L'albédo est normalement défini comme une texture RVB ; cependant, de nombreux matériaux de type terrain (roche, sable, boue, herbe, etc.) se composent d'une palette de couleurs limitée. Vous pouvez exploiter cette propriété en stockant l'albédo sous la forme d'un gradient en niveaux de gris, puis en procédant à un remappage des couleurs dans le nuanceur.

Il n'existe pas de méthode fixe pour convertir l'albédo RVB en un gradient de niveaux de gris. Pour cette expérience, l'albédo en niveaux de gris a été créé par masquage sélectif des canaux de la carte d'albédo originale et de l'occlusion ambiante ; pour faire correspondre la couleur proéminente dans la reconstruction des couleurs du shader, il suffit de faire des ajustements manuels.

Coloration de la lumière et de l'obscurité avec ajustement du contraste de la rampe pour la reconstruction de l'albédo.

Smoothness

Le lissage est considéré comme très important pour la définition des matériaux PBR. Pour définir plus précisément la douceur, elle dispose de son propre canal.

Un simple multiplicateur a été ajouté au lissage dans le shader pour obtenir une certaine variation dans le matériau.

Multiplicateur de lissage

Définition normale

La carte des normales est importante pour montrer les caractéristiques détaillées d'une surface. Un matériau PBR typique utilise une carte de normalité dans l'espace tangent. Dans cette expérience, j'ai choisi une carte dérivée pré-convertie utilisant le cadre du gradient de surface pour les raisons suivantes. (Pour plus d'informations, voir lecadre du gradient de surface de MortenMikkelsen ).

Pour pré-convertir les cartes normales de l'espace tangent en dérivées, utilisez cette action Photoshop.

L'utilisation d'une carte de produits dérivés pré-convertie présente plusieurs avantages :

  • Peut être directement converti en gradient de surface, ce qui nécessite moins d'instructions qu'une carte normale standard de l'espace tangent, qui nécessite une conversion des dérivés dans le nuanceur.
  • Peut être stocké dans deux canaux (dHdu et dHdv), ce qui permet de réduire l'empreinte de la mémoire et du cache de texture lors de l'exécution.
  • Ne nécessite pas de reconstruction du canal bleu dans le shader, ce qui est typique lors du traitement des cartes normales de l'espace tangent, puisque le cadre du gradient de surface prend en charge la reconstruction de la normale (moins d'instructions dans le shader).
  • Fonctionne correctement lorsqu'il est ajusté dans Photoshop - c'est-à-dire par mélange, masquage ou réduction de l'intensité - et ne nécessite pas de renormalisation. Par exemple, pour réduire l'intensité, il suffit de mélanger la carte avec RGB(128,128,0).

En conjonction avec le cadre du gradient de surface, les avantages comprennent également :

  • Les informations relatives aux bosses normales peuvent être mélangées et composées dans le shader de la même manière que le mélange/la composition de l'albédo, avec un résultat correct.
  • L'augmentation, la réduction et l'inversion des contributions des bosses sont triviales et précises.

Mais les dérivées pré-converties de la carte des normales de l'espace tangent présentent également certains inconvénients :

  • Grâce à la conversion Photoshop, la définition normale est bridée à un angle supérieur à 45 degrés, afin d'équilibrer la précision dans une texture 8 bits.
  • Les artistes ont l'habitude de travailler avec des cartes de normales de l'espace tangent et ont besoin que les cartes soient pré-converties via Photoshop dans le cadre de leur flux de travail.

Remarque : Le serrage à un angle supérieur à 45 degrés ne s'applique pas à la conversion des dérivés basée sur les shaders.

En fonction de votre cas d'utilisation, la limitation peut avoir un effet plus ou moins important. Dans cette expérience, une direction normale inférieure à 45 degrés n'a pas d'impact négatif notable sur le résultat final. En fait, dans ce cas, elle offre un avantage en réduisant les réflexions indésirables dans la direction normale extrême.

Comparaison d'une texture de carte dérivée pré-convertie et d'une texture de carte normale de l'espace tangent.
Différences de stress test entre les dérivés pré-convertis et la carte normale de l'espace tangent. Notez que la bosse sphérique présente quelques artefacts dus à la fermeture à 45 degrés de la carte des dérivés pré-convertie.
Graphique
Graphique
Graphique

Le processus de déballage complet

Graphique

Le sous-graphe complet pour décompresser la texture Compact PBR afin d'obtenir l'albédo coloré, la douceur et le gradient de surface.

Remarque : La conversion du gradient de surface en valeur normale est effectuée en dehors du sous-graphe afin que le matériau puisse être facilement mélangé sur la base de la sortie du sous-graphe décompressé.

Matériaux
Matériaux
2. Superposition des matériaux

Pour cette expérience, j'ai choisi une méthode de superposition basée sur les niveaux sur un remappage de canal unique. Le sous-graphe effectue cinq interpolations linéaires (plus la base, formant six couches).

Il existe de nombreuses façons de mélanger les poids des calques. Cette méthode présente la simplicité d'un seul vecteur d'entrée, ce qui convient à l'objectif de l'expérience. Cela a permis de nombreuses superpositions sans avoir à brûler plusieurs canaux dans les splat maps ou les canaux de vertex.

L'inconvénient de cette méthode est que vous ne pouvez pas contrôler le poids de la contribution d'une couche individuelle. Le mélange sera toujours une transition par rapport au calque précédent. Selon le cas d'utilisation, il peut s'agir d'un facteur limitant par rapport à un mélange traditionnel par canal.

Graphique

Le sous-graphe permet de remapper un seul canal pour représenter les six couches.

Le sous-graphe ci-dessus est prédéfini pour six couches de mélange par niveaux. Pour créer davantage de couches, divisez 1 par le nombre souhaité de couches mélangées, soustrayez 1, puis remappez chaque couche en fonction de cette plage de valeurs.

Par exemple, pour un matériau de mélange à neuf couches, la plage de remappage de chaque couche est de 1/(9-1) = 0,125.

Il faut savoir qu'au fur et à mesure que l'on divise le canal unique en portions plus petites, la plage d'ombrage diminue.

Superposition
Graphique
Matériaux
3. Extension de la fonctionnalité du matériel

Le mélange des couches ne nécessite qu'un seul canal (le canal rouge des vertex). Les trois autres canaux de vertex offrent des fonctionnalités supplémentaires. Le graphique de nuanceur final produit des résultats en utilisant les canaux de vertex restants.

Dans cette expérience, la peinture de vertex a été réalisée dans l'éditeur Unity à l'aide de Polybrush (disponible dans le gestionnaire de paquets). Palette de couleurs Vertex Paint suggérée pour ce nuanceur.

Rouge : Utilisé pour pondérer la contribution de la couche. Démonstration de la peinture du canal de vertex rouge

Vert : Définit la propriété de gradient de surface, pour inverser, réduire ou ajouter la contribution de la bosse normale (remappée à -1 et 1).

  • 0 inverse la bosse normale (-1)
  • La valeur 0,5 annule la bosse normale (0)
  • 1 règle la bosse normale sur la valeur d'origine (+1).

Démonstration de la peinture du canal vert

Bleu : Contrôle de la douceur et de l'échelle des bosses de gradient de surface pour créer un aspect d'eau mouillée.

  • 0 = aucune modification
  • 255 = douceur maximale et carte normale plate (aspect mouillé)

Démonstration de la peinture du canal de vertex bleu

Alpha : Contrôle le poids de la couche d'albédo, en fixant la couleur de base au blanc, la contribution étant basée sur l'axe y de la normale à la surface. Il n'altère pas la douceur et tire parti de la douceur de la couche de surface d'origine et de la propriété des bosses.

  • 0 = pas de neige
  • 255 = neige solide

Peinture du canal vertex alpha combinée avec les canaux précédents pour montrer comment les couches entières interagissent avec la neige.

Les résultats combinés des différents canaux de peinture de vertex :

Vous pouvez ajuster la méthode de mélange du shader et les paramètres des diverses fonctionnalités de canal de vertex/mappage de saturation en fonction des exigences de votre projet.

4. Comparaison des performances

L'objectif de cette expérience était d'étendre la fonctionnalité du Shader Graph tout en minimisant les ressources. La texture a été prétraitée et décompactée, mais y a-t-il un avantage en termes d'efficacité d'exécution ?

L'établissement de profils de performance montre les gains d'efficacité que ces efforts ont permis de réaliser.

Un nuanceur de mélange standard à six couches a été créé à des fins de comparaison avec le nuanceur de mélange compact à six couches. Les deux ombres ont été créées à l'aide d'une méthode de mélange identique, avec les mêmes fonctionnalités. La principale différence est que le shader standard utilise trois textures différentes pour représenter une seule couche.

Pour le profilage, un seul maillage a été rendu à l'écran avec un matériau de mélange à l'aide du pipeline de rendu universel dans la plateforme ciblée.

Mémoire mobile et profil de performance

Compression de texture pour mobile (Android) :

PBR standard avec Albedo, Mask et Normal map à 1024x1024 pour mobile :

  • Carte d'albédo 6x ASTC 10x10 = 6x 222.4 KB
  • Carte de masque 6x ASTC 8x8 = 6x 341.4 KB
  • Carte normale 6x ASTC 8x8 = 6x 341.4 KB

Utilisation totale de la mémoire des textures 5.431 MB

PBR compact à 1024x1024 pour mobile :

  • 6x PackedPBR Texture ASTC 8x8 = 6x 341.4 KB

Utilisation totale de la mémoire des textures 2.048 MB

Grâce au matériau compact à six couches, la consommation de mémoire de texture est réduite d'environ 62 % sur les téléphones mobiles (Android), ce qui représente une économie de plus de la moitié. Mobile Android/Vulcan avec Adreno 630 (Snapdragon 845) ; résultats du profil Snapdragon:

  • Réduction d'environ 70 % de la mémoire de texture lue en cours d'exécution.
  • La norme a pris 9971020 horloges pour être rendue.
  • Le compact a pris 6951439 horloges pour être rendu.

Les matériaux compacts s 'affichent à l'écran environ 30 % plus rapidement. Résultat du profilage effectué par Snapdragon Profiler.

Mémoire du PC et profil de performance

PBR standard avec albédo, masque et carte de normalité à 1024x1024 :

  • 6x carte d'albédo DTX1 = 6x 0.7 MB
  • 6x Carte masque DXT5/BC7 = 6x 1,3 MB
  • 6x Normal map DXT5/BC7 = 6x 1.3 MB Utilisation totale de la mémoire des textures 19.8 MB

PBR compact à 1024x1024 :

  • 6x PackedPBR Texture BC7 = 6x 1.3 MB

Utilisation totale de la mémoire des textures 7.8 MB

Le matériau compact à six couches consomme 60 % moins de mémoire de texture sur PC (soit une économie de plus de la moitié).

Ordinateur portable avec Radeon 460 Pro, rendu à 2880x1800 ; résultats du profil RenderDoc :

  • Dessiner des opaques pour un mélange standard à 6 couches : 5.186 ms.
  • Draw Opaques pour un mélange compact de 6 couches : 3,632 ms. Les matériaux compacts sont rendus à l'écran environ 30 %* plus rapidement. *La valeur du profil RenderDoc fluctue ; 30% est une moyenne d'échantillons.

PC de bureau avec nVidia GTX 1080 à 2560x1440 ; résultats du profil nSight :

  • Rendu opaque pour un matériau standard à 6 couches : 0,87 ms
  • Rendu opaque pour un matériau compact à 6 couches : 0,48 ms

Les matériaux compacts s 'affichent à l'écran environ 45 % plus rapidement. Résultats du profilage de nSight.

Profil de performance de la console

Sur PlayStation 4, l'utilisation de matériaux compacts permet d'économiser 60 % de mémoire, ce qui est identique à ce qui se passe sur PC, la PS4 utilisant la même compression.

Rendu de base de la PS4 à 1920x 1080 ; résultats du profil Razer :

  • Rendu opaque pour un matériau standard à 6 couches : 2,11 ms
  • Rendu opaque pour un matériau compact à 6 couches : 1,59 ms

Les matériaux compacts sont affichés à l'écran environ 24,5 % plus rapidement.

Résultat du profilage effectué par le profileur PS4 Razor.

En résumé, l'utilisation d'un nuanceur PBR compact à six couches offre un gain de performance et des économies de mémoire significatives. La variation des performances du GPU est intéressante mais attendue, car le déballage du matériel consomme plus d'ALU que l'échantillonnage d'un plus grand nombre de textures.

Télécharger l'exemple de projet

Cet exemple de projet avec les graphiques de shaders et les sous-graphes peut être téléchargé ici :

[TÉLÉCHARGER ICI], Unity 2020.2.5f1 avec HDRP 10.3.1

[TÉLÉCHARGER ICI], Unity 2020.2.5f1 avec URP 10.3.1

[TÉLÉCHARGER ICI], action Photoshop pour pré-convertir la carte des normales de l'espace tangent en dérivées.

À emporter

Capture d'écran de la version Universal Render Pipeline du projet.

Les principaux éléments de cette expérience sont les suivants

  • Graphique de shaders pour les matériaux personnalisés
  • Dérivés pré-convertis
  • Cadre du gradient de surface
  • Reconstruction de l'albédo couleur
  • Mélange de couches à canal unique
  • Technique de mélange UpVector, contrôle de la douceur et des bosses par le biais du mélange des canaux de vertex

Cette expérience montre comment vous pouvez utiliser Shader Graph pour produire de beaux graphiques tout en étant efficaces. Nous espérons que cet exemple incitera les artistes et les développeurs à repousser les limites esthétiques de leurs projets Unity.

A propos de l'auteur

Rinaldo Tjan (directeur artistique technique, R&D, équipe Spotlight) est un artiste 3D en temps réel qui se passionne pour les systèmes d'éclairage et de rendu en temps réel.

Ayant commencé sa carrière à l'époque de la PlayStation 2, il possède plus d'une décennie de connaissances sur le flux de travail des artistes de bout en bout, de la texturation à la création de la scène finale. Avant de rejoindre Unity Technologies, il a participé à la réalisation de jeux AAA tels que BioShock 2, The Bureau : XCOM Declassified, et Mafia III.

Il travaille actuellement avec les clients d'Unity pour les aider à améliorer leurs projets et à réaliser leur véritable potentiel en utilisant Unity, tout en contribuant au développement interne et aux normes des fonctions de rendu d'Unity.