Substrate apporte des modifications à la manière dont les données relatives aux matériaux sont collectées, traitées, stockées et utilisées pour l'éclairage. Dans ce document, nous vous donnons un aperçu du fonctionnement du système pour les programmeurs.
Du point de vue de la création, un matériau peut continuer à utiliser les entrées du nœud racine existant ou utiliser les nœuds de matériau Substrate (blocs, opérateurs) et les relier à l'entrée Matériau avant du nœud racine. Dans un shader de matériau, cela se traduit de la façon suivante : TEMPLATE_USES_SUBSTRATE==0 dans le premier cas, TEMPLATE_USES_SUBSTRATE==1 dans le deuxième cas.
Lors de l'utilisation de l'éclairage différé, les données du matériau sont stockées dans un espace de stockage intermédiaire appelé tampon graphique. Substrate offre deux modes de stockage dans le tampon graphique :
Tampon graphique fusionnable : ce mode est similaire au format de stockage du tampon graphique existant.
Tampon graphique adaptatif : cet espace de stockage est remplacé par un flux de bits de données, dont le format change d'un pixel à l'autre.
Ce format de tampon graphique est configuré dans les paramètres du projet et dépend de la prise en charge ou non du tampon graphique adaptatif par la plateforme cible prévue.
Pour en savoir plus sur le tampon graphique et son utilisation avec Substrate, consultez la section "Tampon graphique" de la page Vue d'ensemble des matériaux Substrate.
Données de texture de scène
Les données de texture de scène continuent d'être interrogées avec SceneTextureLookup() pour les formats de tampon graphique fusionnable et de tampon graphique adaptatif. Lors de l'utilisation du tampon graphique adaptatif, cette fonction ne renvoie que les données de la première fermeture.
Shader global
Lorsque vous devez accéder aux données dans un shader global en mode de rendu différé (par exemple, à des fins d'éclairage), il est nécessaire de déclarer et de lier le paramètre global Substrate comme suit :
class FMyGlobasShaderCS : public FGlobalShader
{
DECLARE_SHADER_TYPE(FMyGlobasShaderCS, Global)
SHADER_USE_PARAMETER_STRUCT(FMyGlobasShaderCS, FGlobalShader);
using FPermutationDomain = TShaderPermutationDomain<>;
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
...
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FSubstrateGlobalUniformParameters, Substrate)
...
END_SHADER_PARAMETER_STRUCT()
FMyGlobasShaderCS::FParameters PassParameters;
PassParameters.Substrate = Substrate::BindSubstrateGlobalUniformParameters(View);Dans le shader, les formats de tampon graphique fusionnable et adaptatif doivent être gérés.
Une meilleure abstraction est prévue dans une prochaine version pour faciliter la maintenance.
#if SUBSTRATE_LOAD_FROM_MATERIALCONTAINER
// For Adaptive GBuffer
FSubstrateAddressing Addressing = GetSubstratePixelDataByteOffset(PixelPos, uint2(View.BufferSizeAndInvSize.xy), Substrate.MaxBytesPerPixel);
FSubstratePixelHeader Header = UnpackSubstrateHeaderIn(Substrate.MaterialTextureArray, Addressing, Substrate.TopLayerTexture);
#else
// For Blendable GBuffer
FSubstrateGBufferBSDF Data = SubstrateReadGBufferBSDF(GetScreenSpaceDataUint(PixelPos));
#endif
Shader de matériau
Dans un shader de matériau, si l'entrée Matériau avant est reliée au matériau, TEMPLATE_USES_SUBSTRATE==1 est défini et les données de fermeture peuvent être traitées et récupérées comme suit :
// Initialise a Substrate header with normal in registers
FSubstrateData SubstrateData = PixelMaterialInputs.GetFrontSubstrateData();
FSubstratePixelHeader Header = MaterialParameters.GetFrontSubstrateHeader();
Header.IrradianceAO.MaterialAO = GetMaterialAmbientOcclusion(PixelMaterialInputs);
if (Header.SubstrateTree.BSDFCount > 0)
{
FSubstrateIntegrationSettings Settings = InitSubstrateIntegrationSettings(false, true, 0, false);
float3 TotalTransmittancePreCoverage = 0;
Header.SubstrateUpdateTree(SubstrateData, V, Settings, TotalCoverage, TotalTransmittancePreCoverage);
Pour les matériaux n'utilisant pas de nœuds Substrate, tels que les entrées de l'ancien nœud racine, TEMPLATE_USES_SUBSTRATE==0 est défini et les données peuvent être récupérées comme à l'accoutumée :
float3 BaseColor = GetMaterialBaseColor(PixelMaterialInputs);
float Metallic = GetMaterialMetallic(PixelMaterialInputs);
...Propriétés des matériaux
Une fois qu'un contexte BSDF a été récupéré (voir le code ci-dessus), vous pouvez accéder aux données de fermeture comme suit :
SLAB_DIFFUSEALBEDO(BSDFContext.BSDF)
SLAB_F0(BSDFContext.BSDF);
SLAB_ROUGHNESS(BSDFContext.BSDF)Évaluation de l'éclairage
Pour évaluer une lumière particulière avec un éclairage différé, utilisez la fonction suivante qui se trouve dans Substrate\SubstrateDeferredLighting.ush :
FSubstrateDeferredLighting SubstrateDeferredLighting(...)Pour évaluer l'ensemble de l'éclairage en mode de rendu direct, utilisez la fonction suivante qui se trouve dans Substrate\SubstrateForwardLighting.ush :
float3 SubstrateForwardLighting(...)De plus, deux fonctions utiles pour l'évaluation, respectivement l'éclairage analytique et l'éclairage ambiant, sont disponibles dans Substrate/SubstrateEvaluation.ush :
// Analytical lighting
FSubstrateEvaluateResult SubstrateEvaluateBSDFCommon(...);
// Environment lighting
FSubstrateEnvLightResult SubstrateEvaluateForEnvLight(...);Fichiers de shader
Voici une liste de fichiers de shader courants :
Il est possible que l'API de shader actuelle soit modifiée dans les prochaines versions.
| Fichiers de shader | Description |
|---|---|
| Contient les structures de données principales de Substrate, les accesseurs de données, ainsi que la lecture des données pour le tampon graphique adaptatif. |
| Contient la logique de lecture/déballage des données du tampon graphique fusionnable. |
| Contient la logique d'évaluation d'ombrage principale pour l'éclairage analytique et l'éclairage ambiant. |
| Contient l'évaluation d'ombrage du chemin d'éclairage différé. |
| Contient l'évaluation d'ombrage du chemin d'éclairage avant. |
Ressources supplémentaires
Présentation technique de Substrate : Siggraph 2023 - Unreal Engine Substrate: Authoring Materials That Matter
Présentation de création dans Substrate : Unreal Fest 2025 Stockholm - Everything You Wanted to Know About Substrate