This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Le rendu physiquement réaliste (Physically Based Rendering, PBR) est une approche de l’ombrage qui modélise l’interaction de la lumière avec les surfaces à l’aide de principes physiques. Les propriétés du matériau, telles que la couleur de base, le facteur métallique et la rugosité, décrivent la surface indépendamment de l’éclairage de la scène.
Les matériaux glTF intégrés fournissent un éclairage PBR. Defold expose également les propriétés des matériaux glTF 2.0 importés et les données des extensions Khronos prises en charge aux shaders personnalisés.
Affectez un fichier glTF ou GLB à la propriété Scene d’un composant Model. Lorsque l’éditeur propose de renseigner les matériaux et les textures, choisissez Auto Fill pour appliquer les liaisons de matériaux générées depuis la scène, en remplaçant les liaisons existantes. Ces matériaux utilisent les shaders glTF intégrés et peuvent référencer directement les images intégrées. Choisissez Keep Current pour conserver vos liaisons et affecter manuellement les matériaux et textures. Consultez le flux d’importation de modèles pour parcourir les ressources intégrées et sélectionner des maillages individuels.
Les matériaux suivants sont disponibles dans /builtins/materials/. Choisissez la variante correspondant à votre modèle et à son utilisation éventuelle de l’instanciation :
| Type de modèle | Matériau |
|---|---|
| Statique, sans instanciation | gltf.material |
| Statique, avec instanciation | gltf_instanced.material |
| Avec skinning (animé), sans instanciation | gltf_skinned.material |
| Avec skinning (animé), avec instanciation | gltf_skinned_instanced.material |
Les quatre utilisent l’espace local pour les sommets et le même shader de fragment gltf.fp. Les variantes avec skinning effectuent celui-ci sur le GPU. Consultez les exigences des matériaux de modèles pour le skinning sur GPU et l’instanciation.
Pour les liaisons de textures manuelles, les matériaux intégrés utilisent les noms de samplers suivants :
| Texture | Sampler | Données utilisées |
|---|---|---|
| Couleur de base | PbrMetallicRoughness_baseColorTexture |
Couleur RGB et alpha |
| Métal/rugosité | PbrMetallicRoughness_metallicRoughnessTexture |
Rugosité dans G, métal dans B |
| Normale | PbrMaterial_normalTexture |
Normale dans l’espace tangent en RGB |
| Occlusion | PbrMaterial_occlusionTexture |
Occlusion dans R |
| Émission | PbrMaterial_emissiveTexture |
Couleur RGB |
Configurez une caméra et ajoutez des composants Light pour éclairer le modèle. Le shader utilise les lumières directionnelles, ponctuelles et spots pour l’éclairage direct, ainsi que les lumières ambiantes pour une contribution ambiante simple. Les matériaux possèdent le tag model, que le script de rendu par défaut dessine. Un script de rendu personnalisé doit dessiner un prédicat correspondant.
Les shaders intégrés implémentent l’ombrage métal/rugosité, la couleur de base et la couleur des sommets, le placage de normales lorsque des données de tangentes sont disponibles, l’occlusion et l’émission, y compris son intensité. Les textures de couleur de base et d’émission sont décodées depuis sRGB pour l’éclairage, et la couleur finale est reconvertie en sRGB. Les textures métal/rugosité, de normales et d’occlusion contiennent des données linéaires.
Le shader respecte les matériaux sans éclairage et l’alpha masqué, et ajuste les normales des surfaces à double face. L’état de rendu reste important :
graphics.BLEND_FACTOR_SRC_ALPHA et graphics.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, puis gérez l’ordre de dessin des objets transparents et les écritures de profondeur dans votre script de rendu. La passe de modèles par défaut n’active pas automatiquement le mélange.La contribution ambiante intégrée est une approximation, sans éclairage par carte d’environnement ni ombres. Les effets comme le vernis, la transmission, le lustre, l’iridescence et le flux spéculaire/brillance nécessitent un ombrage personnalisé ; l’importation de leurs paramètres n’active pas ces effets dans gltf.fp.
Les propriétés suivantes sont extraites des fichiers source glTF 2.0 affectés à un composant Model. Cette liste décrit les données de matériau disponibles ; l’éclairage intégré utilise le sous-ensemble décrit ci-dessus. Toutes les propriétés ne sont pas standard. Certaines sont fournies par des extensions glTF facultatives, que l’outil d’exportation peut inclure ou non. L’extension concernée est indiquée entre parenthèses après le nom de propriété ci-dessous.
Les sections suivantes concernent les shaders personnalisés. Copiez la ressource .material intégrée appropriée et gltf.fp dans votre projet, puis faites pointer le Fragment Program du matériau copié vers votre shader. Conservez le programme de sommets glTF correspondant, les noms des samplers et l’espace local des sommets, sauf si vous remplacez aussi ces interfaces.
Les fonctions utilitaires intégrées séparent l’échantillonnage des textures de la préparation des surfaces, des calculs de BRDF et de l’éclairage. gltf_sampling.glsl lit le bloc uniforme brut PbrMaterial et produit une valeur PBRMaterial contenant les entrées de matériau résolues et linéaires. gltf_lighting.glsl fournit l’éclairage direct et ambiant et combine leurs contributions. La capitalisation distingue le bloc uniforme brut de la structure du matériau échantillonné.
Ce shader de fragment augmente la rugosité minimale tout en conservant l’éclairage intégré. Il fonctionne avec les programmes de sommets utilisés par les quatre variantes de matériaux glTF :
#version 140
#include "/builtins/materials/gltf_sampling.glsl"
#include "/builtins/materials/gltf_lighting.glsl"
out vec4 out_fragColor;
void main()
{
PBRMaterial inputs = pbr_sample_material(var_texcoord0, var_color);
inputs.roughness = max(inputs.roughness, 0.35);
// Sample textures, including the normal map, before discarding fragments.
PBRSurface surface = pbr_sample_surface(inputs, var_texcoord0);
if ((!inputs.doubleSided && !gl_FrontFacing) || pbr_should_discard_alpha(inputs))
{
discard;
}
// Derive BRDF values after editing the material inputs.
MaterialInfo material = pbr_create_material_info(inputs);
PBRLighting lighting = pbr_create_lighting();
if (!inputs.unlit)
{
lighting.direct = pbr_evaluate_direct_lighting(material, surface, var_view);
lighting.indirect = pbr_evaluate_ambient_lighting(material, ambient_light());
}
vec3 color = pbr_compose_lighting(inputs, lighting, inputs.occlusion, inputs.occlusion);
out_fragColor = vec4(pbr_linear_to_srgb(color), pbr_get_alpha(inputs));
}
Modifiez les entrées de matériau échantillonnées avant d’appeler pbr_create_material_info(). Si vous changez la position dans l’espace de vue ou les normales d’une surface, appelez pbr_finalize_surface(surface, var_view) pour actualiser ses champs dérivés dans l’espace monde. Pour une BRDF personnalisée ou des contributions lumineuses individuelles, utilisez ou remplacez pbr_evaluate_brdf() et pbr_evaluate_light() dans les fonctions utilitaires intégrées.
Vous pouvez remplacer lighting.indirect par votre propre éclairage d’environnement ou illumination globale. Ses contributions diffuses et spéculaires sont une lumière sortante linéaire ; n’appliquez donc pas une deuxième fois la BRDF du matériau. Appliquez la visibilité des ombres à la contribution lumineuse directe concernée ; les arguments de visibilité de pbr_compose_lighting() n’affectent que l’éclairage indirect. Pour un pipeline HDR, écrivez la couleur linéaire dans la cible intermédiaire et effectuez la conversion sRGB dans la passe finale.
Pour un shader entièrement personnalisé, déclarez un bloc uniforme nommé PbrMaterial avec les noms et types de membres reconnus. Defold remplit les champs correspondants depuis le matériau glTF source. Les déclarations ci-dessous décrivent les structures de fonctionnalités disponibles ; n’incluez que celles nécessaires à votre shader. Déclarer une structure fournit les données, mais votre shader doit implémenter son comportement d’échantillonnage et d’éclairage.
Ne redéclarez pas le bloc uniforme ni PbrMetallicRoughness lorsque vous incluez gltf_sampling.glsl, qui les déclare déjà. Les déclarations suivantes constituent une alternative pour les shaders qui gèrent leurs propres entrées de matériau.
struct PbrMetallicRoughness
{
vec4 baseColorFactor;
// R: metallic (Default=1.0), G: roughness (Default=1.0)
vec4 metallicAndRoughnessFactor;
// R: use baseColorTexture, G: use metallicRoughnessTexture
vec4 metallicRoughnessTextures;
};
struct PbrSpecularGlossiness
{
vec4 diffuseFactor;
// RGB: specular (Default=1.0), A: glossiness (Default=1.0)
vec4 specularAndSpecularGlossinessFactor;
// R: use diffuseTexture, G: use specularGlossinessTexture
vec4 specularGlossinessTextures;
};
struct PbrClearCoat
{
// R: clearCoat (Default=0.0), G: clearCoatRoughness (Default=0.0)
vec4 clearCoatAndClearCoatRoughnessFactor;
// R: use clearCoatTexture, G: use clearCoatRoughnessTexture, B: use clearCoatNormalTexture
vec4 clearCoatTextures;
};
struct PbrTransmission
{
// R: transmission (Default=0.0)
vec4 transmissionFactor;
// R: use transmissionTexture
vec4 transmissionTextures;
};
struct PbrIor
{
// R: ior (Default=0.0)
vec4 ior;
};
struct PbrSpecular
{
// RGB: specularColor, A: specularFactor (Default=1.0);
vec4 specularColorAndSpecularFactor;
// R: use specularTexture, G: use specularColorTexture
vec4 specularTextures;
};
struct PbrVolume
{
// R: thicknessFactor (Default=0.0), GBA: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attenuationDistance (Default=-1.0)
vec4 attenuationDistance;
// R: use thicknessTexture
vec4 volumeTextures;
};
struct PbrSheen
{
// RGB: sheenColor, A: sheenRoughnessFactor (Default=0.0)
vec4 sheenColorAndRoughnessFactor;
// R: use sheenColorTexture, G: use sheenRoughnessTexture
vec4 sheenTextures;
};
struct PbrEmissiveStrength
{
// R: emissiveStrength (Default=1.0)
vec4 emissiveStrength;
};
struct PbrIridescence
{
// R: iridescenceFactor (Default=0.0), G: iridescenceIor (Default=1.3), B: iridescenceThicknessMin (Default=100.0), A: iridescenceThicknessMax (Default=400.0)
vec4 iridescenceFactorAndIorAndThicknessMinMax;
// R: use iridescenceTexture, G: use iridescenceThicknessTexture
vec4 iridescenceTextures;
};
Les propriétés communes et les structures de fonctionnalités sont des membres du bloc uniforme. Les composantes regroupées sont les suivantes :
uniform PbrMaterial
{
// X: alpha cutoff, Y: double-sided, Z: unlit,
// W: alpha mode (0 = opaque, 1 = mask, 2 = blend)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// X: has normal texture, Y: has occlusion texture, Z: has emissive texture
vec4 pbrCommonTextures;
// RGB: emissive factor, W: emissive strength
vec4 pbrEmissiveFactorAndStrength;
// X: normal scale, Y: occlusion strength
vec4 pbrNormalScaleAndOcclusionStrength;
PbrMetallicRoughness pbrMetallicRoughness;
PbrSpecularGlossiness pbrSpecularGlossiness;
PbrClearCoat pbrClearCoat;
PbrTransmission pbrTransmission;
PbrIor pbrIor;
PbrSpecular pbrSpecular;
PbrVolume pbrVolume;
PbrSheen pbrSheen;
PbrEmissiveStrength pbrEmissiveStrength;
PbrIridescence pbrIridescence;
};
Omettez les membres de fonctionnalités inutilisés du bloc. Si le bloc ou les champs reconnus d’une fonctionnalité sont absents, les données correspondantes ne sont pas fournies. Les indicateurs de présence de textures décrivent les références de textures du matériau source ; un matériau personnalisé a toujours besoin de déclarations de samplers et de liaisons de textures correspondantes pour les cartes qu’il échantillonne.
Les champs de fonctionnalités utilisent des noms comme pbrMetallicRoughness.baseColorFactor ; les champs communs utilisent des noms comme pbrEmissiveFactorAndStrength. Le moteur renseigne ces constantes depuis le matériau importé, ou depuis un matériau par défaut lorsque le modèle ne contient pas de données de matériau. Définir des valeurs par défaut dans la ressource .material ne remplace pas les valeurs importées.
Pour personnaliser l’ombrage intégré, modifiez le PBRMaterial échantillonné avant de dériver ses valeurs de BRDF, comme dans l’exemple ci-dessus. Pour des contrôles supplémentaires à l’exécution, déclarez vos propres constantes de shader et utilisez l’API des constantes de matériau de modèle.
Utilisez les matériaux intégrés pour le flux glTF standard métal/rugosité. Étendez les fonctions utilitaires des shaders ou fournissez votre propre matériau lorsque vous avez besoin d’une BRDF différente, d’un éclairage d’environnement, d’ombres ou d’effets de matériau glTF supplémentaires.
Voir aussi :