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
Les matériaux servent à définir la manière dont un composant (component) graphique (un sprite, une tilemap, une police, un nœud d’interface graphique, un modèle, etc.) doit être rendu.
Un matériau contient des étiquettes, des informations utilisées dans le pipeline de rendu pour sélectionner les objets à rendre. Il contient également des références à des programmes de shader, qui sont compilés par le pilote graphique disponible, transférés au matériel graphique et exécutés lors du rendu du composant à chaque image.
Pour créer un matériau, faites un clic droit sur un dossier cible dans le navigateur Assets et sélectionnez New... ▸ Material. (Vous pouvez également sélectionner File ▸ New... dans le menu, puis Material). Nommez le nouveau fichier de matériau et appuyez sur Ok.

Le nouveau matériau s’ouvre dans le Material Editor.

Le fichier de matériau contient les informations suivantes :
render.enable_material() de l’API de rendu. Ce nom devrait être unique..vp) à utiliser pour le rendu avec ce matériau. Le programme de shader de sommets s’exécute sur le GPU pour chaque sommet des primitives d’un composant. Il calcule la position de chaque sommet à l’écran et peut aussi produire des variables « varying », qui sont interpolées et transmises en entrée au programme de fragments..fp) à utiliser pour le rendu avec ce matériau. Le programme s’exécute sur le GPU pour chaque fragment (pixel) d’une primitive et détermine la couleur de chaque fragment. Il procède généralement par lectures de textures et calculs à partir des variables d’entrée (variables varying ou constantes).render.predicate() pour regrouper les composants qui doivent être dessinés ensemble. Consultez la documentation sur le rendu pour savoir comment procéder. Vous pouvez utiliser au maximum 32 étiquettes dans un projet.Les attributs de shader (également appelés flux de sommets ou attributs de sommet) constituent le mécanisme par lequel le GPU récupère les sommets en mémoire pour rendre la géométrie. Le shader de sommets spécifie un ensemble de flux à l’aide du mot-clé attribute et, dans la plupart des cas, Defold produit et lie automatiquement les données en interne d’après les noms des flux. Toutefois, vous pouvez parfois vouloir transmettre davantage de données par sommet pour obtenir un effet particulier que le moteur ne produit pas. Un attribut de sommet peut être configuré à l’aide des champs suivants :
SEMANTIC_TYPE_COLOR affiche un sélecteur de couleur dans l’éditeur, tandis que les données sont toujours transmises telles quelles du moteur au shader.
SEMANTIC_TYPE_NONE Le type sémantique par défaut. N’a aucun autre effet sur l’attribut que de transmettre directement les données du matériau pour cet attribut au tampon de sommets (par défaut)SEMANTIC_TYPE_POSITION Produit des données de position par sommet pour l’attribut. Peut être utilisé avec l’espace de coordonnées pour indiquer au moteur comment calculer les positionsSEMANTIC_TYPE_TEXCOORD Produit des coordonnées de texture par sommet pour l’attributSEMANTIC_TYPE_PAGE_INDEX Produit des indices de page par sommet pour l’attributSEMANTIC_TYPE_COLOR Influence la manière dont l’éditeur interprète l’attribut. Si un attribut est configuré avec une sémantique de couleur, un sélecteur de couleur s’affiche dans l’inspecteurSEMANTIC_TYPE_NORMAL Produit des données de normale par sommet pour l’attributSEMANTIC_TYPE_TANGENT Produit des données de tangente par sommet pour l’attributSEMANTIC_TYPE_WORLD_MATRIX Produit des données de matrice monde par sommet pour l’attributSEMANTIC_TYPE_NORMAL_MATRIX Produit des données de matrice des normales par sommet pour l’attributSEMANTIC_TYPE_TEXTURE_TRANSFORM_2D Produit une matrice de transformation de texture 3x3 par sommet pour l’attribut. Pour les composants de particules, le moteur fournit une matrice qui transforme les coordonnées dans l’espace de l’atlas pour la propriété d’image du composant. Pour les composants sprite, le moteur fournit une matrice pour chaque image utilisée par le composant (lorsque plusieurs textures sont utilisées). Pour les composants de modèle, une matrice identité est fournie.TYPE_BYTE Valeurs d’octets signés sur 8 bitsTYPE_UNSIGNED_BYTE Valeurs d’octets non signés sur 8 bitsTYPE_SHORT Valeurs d’entiers courts signés sur 16 bitsTYPE_UNSIGNED_SHORT Valeurs d’entiers courts non signés sur 16 bitsTYPE_INT Valeurs d’entiers signésTYPE_UNSIGNED_INT Valeurs d’entiers non signésTYPE_FLOAT Valeurs à virgule flottante (par défaut)VECTOR_TYPE_SCALAR Valeur scalaire uniqueVECTOR_TYPE_VEC2 Vecteur 2DVECTOR_TYPE_VEC3 Vecteur 3DVECTOR_TYPE_VEC4 Vecteur 4D (par défaut)VECTOR_TYPE_MAT2 Matrice 2DVECTOR_TYPE_MAT3 Matrice 3DVECTOR_TYPE_MAT4 Matrice 4DVertex Une fois par sommet ; par exemple, un attribut de position est généralement fourni à la fonction de sommets pour chaque sommet du maillage (par défaut)Instance Une fois par instance ; par exemple, un attribut de matrice monde est généralement fourni à la fonction de sommets une fois par instanceLes attributs personnalisés peuvent également réduire l’empreinte mémoire côté CPU comme côté GPU, en reconfigurant les flux pour utiliser un type de données plus petit ou un nombre d’éléments différent.
À l’exécution, le système de matériaux attribue automatiquement un type sémantique par défaut en fonction du nom de l’attribut, pour un ensemble précis de noms :
position - type sémantique : SEMANTIC_TYPE_POSITIONtexcoord0 - type sémantique : SEMANTIC_TYPE_TEXCOORDtexcoord1 - type sémantique : SEMANTIC_TYPE_TEXCOORDpage_index - type sémantique : SEMANTIC_TYPE_PAGE_INDEXcolor - type sémantique : SEMANTIC_TYPE_COLORnormal - type sémantique : SEMANTIC_TYPE_NORMALtangent - type sémantique : SEMANTIC_TYPE_TANGENTmtx_world - type sémantique : SEMANTIC_TYPE_WORLD_MATRIXmtx_normal - type sémantique : SEMANTIC_TYPE_NORMAL_MATRIXmtx_texture_transform_2d - type sémantique : SEMANTIC_TYPE_TEXTURE_TRANSFORM_2DSi le matériau contient des entrées pour ces attributs, le type sémantique par défaut est remplacé par celui que vous avez configuré dans l’éditeur de matériaux.
Comme pour les constantes de shader définies par l’utilisateur, vous pouvez aussi mettre à jour les attributs de sommet à l’exécution en appelant go.get, go.set et go.animate :

go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
La mise à jour des attributs de sommet présente toutefois certaines limites : la possibilité pour un composant d’utiliser la valeur dépend du type sémantique de l’attribut. Par exemple, un composant sprite prend en charge SEMANTIC_TYPE_POSITION ; si vous mettez à jour un attribut de ce type sémantique, le composant ignore la valeur de remplacement, car ce type impose que les données proviennent toujours de la position du sprite.
Les composants de modèle exposent également les attributs de matériau personnalisés par l’intermédiaire de go.get(), go.set() et go.animate(). Par exemple, après avoir défini un attribut nommé my_attribute dans le matériau du modèle :
go.set("#model", "my_attribute", vmath.vector4(1, 0, 0, 1))
go.animate("#model", "my_attribute", go.PLAYBACK_LOOP_PINGPONG,
vmath.vector4(0, 1, 0, 1), go.EASING_LINEAR, 2)
Seul le premier maillage d’un modèle comportant plusieurs maillages peut actuellement être adressé de cette manière. La mise à jour d’un attribut par sommet non instancié peut également reconstruire et transférer une quantité de données de sommets proportionnelle à la taille du maillage ; des mises à jour fréquentes peuvent donc être coûteuses pour les grands maillages.
Lorsqu’un attribut de sommet est un scalaire ou un type de vecteur autre que Vec4, vous pouvez quand même définir ses données avec go.set :
-- The last two components in the vec4 will not be used!
go.set("#sprite", "sprite_position_2d", vmath.vector4(my_x,my_y,0,0))
go.animate("#sprite", "sprite_position_2d", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,2,0,0), go.EASING_LINEAR, 2)
Il en va de même pour les attributs matriciels : si l’attribut est d’un type de matrice autre que Mat4, vous pouvez quand même définir ses données avec go.set.
Utilisation d’un attribut de transformation de texture pour convertir les coordonnées UV dans l’espace de l’atlas :
#version 140
in vec3 position;
in vec4 texcoord0;
in mat3 texture_transform_2d;
out vec2 var_texcoord0;
void main()
{
// Extract position from the transform
vec2 atlas_pos = texture_transform_2d[2].xy;
// Extract the scale from the transform
vec2 atlas_size = vec2(
length(texture_transform_2d[0].xy),
length(texture_transform_2d[1].xy)
);
// convert to local UV (0..1)
vec2 localUV = (texcoord0 - atlas_pos) / atlas_size;
// Alternatively, if the UV coordinates already are in the 0..1 range,
// you can transform into atlas space directly by multiplying the transform:
vec2 transformedUv = texture_transform_2d * texcoord0;
// Pass the value into the fragment shader
var_texcoord0 = localUV;
// ... rest of vertex shader
}
L’instanciation est une technique qui permet de dessiner efficacement plusieurs copies du même objet dans une scène. Au lieu de créer une copie distincte de l’objet à chaque utilisation, l’instanciation permet au moteur graphique de créer un seul objet, puis de le réutiliser plusieurs fois. Par exemple, dans un jeu comportant une grande forêt, au lieu de créer un modèle d’arbre distinct pour chaque arbre, l’instanciation permet de créer un seul modèle, puis de le placer des centaines ou des milliers de fois avec des positions et des échelles différentes. La forêt peut alors être rendue avec un seul appel de rendu au lieu d’un appel distinct pour chaque arbre.
L’instanciation n’est actuellement disponible que pour les composants de modèle.
L’instanciation est activée automatiquement lorsque c’est possible. Defold cherche autant que possible à regrouper les appels qui partagent le même état de rendu ; pour que l’instanciation fonctionne, certaines conditions doivent être remplies :
render.enable_materialPour configurer un attribut de sommet afin qu’il soit répété pour chaque instance, Step function doit être réglé sur Instance. Cela se fait automatiquement pour certains types sémantiques en fonction du nom (voir le tableau Default attribute semantics ci-dessus), mais peut aussi être défini manuellement dans l’éditeur de matériaux en réglant Step function sur Instance.
À titre d’exemple simple, la scène suivante contient quatre objets de jeu (game objects), chacun doté d’un composant de modèle :

Le matériau est configuré ainsi, avec un seul attribut de sommet personnalisé répété pour chaque instance :

Le shader de sommets spécifie plusieurs attributs par instance :
// Per vertex attributes
attribute highp vec4 position;
attribute mediump vec2 texcoord0;
attribute mediump vec3 normal;
// Per instance attributes
attribute mediump mat4 mtx_world;
attribute mediump mat4 mtx_normal;
attribute mediump vec4 instance_color;
Notez que mtx_world et mtx_normal sont configurés par défaut pour utiliser la fonction de progression Instance. Vous pouvez modifier cela dans l’éditeur de matériaux en ajoutant une entrée pour chacun et en réglant Step function sur Vertex, afin que l’attribut soit répété pour chaque sommet au lieu de chaque instance.
Pour vérifier que l’instanciation fonctionne dans ce cas, vous pouvez consulter le profileur web. Ici, comme seuls les attributs par instance changent entre les instances de la boîte, son rendu peut être effectué en un seul appel :

OpenGL 3.1 sur ordinateur et OpenGL ES 3.0 sur mobile proposent l’instanciation comme fonctionnalité de base. Les anciens contextes OpenGL ES et WebGL peuvent encore la prendre en charge grâce à une extension telle que ANGLE_instanced_arrays ; d’autres anciens adaptateurs ne la prennent pas en charge. Lorsque l’instanciation n’est pas disponible, le rendu fonctionne toujours par défaut, mais ses performances peuvent être moindres.
Utilisez graphics.get_adapter_info() pour détecter cette prise en charge et sélectionner un matériau moins coûteux ou exclure les contenus comportant beaucoup d’instances si nécessaire. Le champ features est un tableau contenant les constantes des fonctionnalités prises en charge, et non une table dont ces constantes seraient les clés :
local function has_context_feature(feature)
local adapter_info = graphics.get_adapter_info()
for _, supported_feature in ipairs(adapter_info.features) do
if supported_feature == feature then
return true
end
end
return false
end
local instancing_supported = has_context_feature(
graphics.CONTEXT_FEATURE_INSTANCING
)
Les constantes de shader, ou « uniformes », sont des valeurs transmises par le moteur aux programmes de shader de sommets et de fragments. Pour utiliser une constante, définissez-la dans le fichier de matériau comme propriété Vertex Constant ou Fragment Constant. Les variables uniform correspondantes doivent être définies dans le programme de shader. Les constantes suivantes peuvent être définies dans un matériau :
CONSTANT_TYPE_WORLDCONSTANT_TYPE_VIEWCONSTANT_TYPE_PROJECTIONCONSTANT_TYPE_VIEWPROJCONSTANT_TYPE_WORLDVIEWCONSTANT_TYPE_WORLDVIEWPROJCONSTANT_TYPE_WORLD_INVERSECONSTANT_TYPE_VIEW_INVERSECONSTANT_TYPE_PROJECTION_INVERSECONSTANT_TYPE_VIEWPROJ_INVERSECONSTANT_TYPE_WORLDVIEW_INVERSECONSTANT_TYPE_WORLDVIEWPROJ_INVERSECONSTANT_TYPE_NORMALCONSTANT_TYPE_TIMEvector4 fourni par le moteur, où .x est le temps écoulé depuis le démarrage du moteur, .y est le temps écoulé depuis l’image précédente, et .z et .w valent actuellement zéro. Le moteur met cette valeur à jour automatiquement ; il n’est pas nécessaire de la mettre à jour avec go.set(). Consultez le tutoriel Shadertoy pour un exemple.
Déclarez une constante Time nommée time dans un bloc de variables uniformes en GLSL moderne :
uniform fragment_inputs
{
vec4 time;
};
CONSTANT_TYPE_USERExemple :
go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
CONSTANT_TYPE_USER_MATRIX4Exemple :
go.set("#sprite", "m", vmath.matrix4())
Dans un script GUI, lisez et écrivez les constantes de matériau d’un nœud avec gui.get() et gui.set() plutôt qu’avec les fonctions go. Les composantes de vecteur, les constantes matricielles et les tableaux de constantes sont pris en charge. Dans la table d’options, les indices de tableau commencent à 1 :
local node = gui.get_node("button")
local tint = gui.get(node, "tint")
gui.set(node, "tint.x", 0.5)
gui.set(node, "light_matrix", vmath.matrix4())
gui.set(node, "tint_array", vmath.vector4(1, 0, 0, 1), { index = 1 })
Pour qu’une constante de matériau de type CONSTANT_TYPE_USER ou CONSTANT_TYPE_USER_MATRIX4 soit accessible avec go.get() et go.set(), ou avec gui.get() et gui.set(), elle doit être utilisée dans le programme de shader. Si la constante est définie dans le matériau mais n’est pas utilisée dans le programme, elle est supprimée du matériau et n’est pas disponible à l’exécution.
Les échantillonneurs servent à échantillonner les informations de couleur d’une texture (une source de tuiles ou un atlas). Ces informations de couleur peuvent ensuite être utilisées pour les calculs du programme de shader.
Les composants sprite, tilemap, d’interface graphique et d’effet de particules lient automatiquement leur texture d’image au premier sampler2D déclaré. Les composants sprite prennent également en charge plusieurs textures : chaque échantillonneur déclaré dans le matériau devient un emplacement d’image nommé dans le composant sprite. La première texture fournit les données d’animation du sprite et détermine la séquence des images. Pour chaque image de l’animation, son identifiant est utilisé pour trouver l’image correspondante dans chaque texture supplémentaire, qui fournit ses propres coordonnées UV. Les atlas ou sources de tuiles affectés devraient donc contenir des identifiants d’images d’animation correspondants et des images de formes similaires ; des formes différentes lors du compactage polygonal peuvent provoquer des débordements de texture. Consultez Sprites à plusieurs textures pour plus de détails.
Pour un composant ou un flux de travail de rendu qui n’expose pas d’emplacement de texture supplémentaire, utilisez render.enable_texture() pour lier des échantillonneurs de texture supplémentaires depuis le script de rendu.
![]()
-- mysprite.fp
varying mediump vec2 var_texcoord0;
uniform lowp sampler2D MY_SAMPLER;
void main()
{
gl_FragColor = texture2D(MY_SAMPLER, var_texcoord0.xy);
}
Vous pouvez spécifier les paramètres d’échantillonneur d’un composant en ajoutant l’échantillonneur par son nom dans le fichier de matériau. Si vous ne configurez pas votre échantillonneur dans ce fichier, les paramètres globaux graphics du projet sont utilisés.

Pour les composants de modèle, vous devez spécifier vos échantillonneurs dans le fichier de matériau avec les paramètres souhaités. L’éditeur vous permet alors de définir des textures pour tout composant de modèle utilisant ce matériau :

-- mymodel.fp
varying mediump vec2 var_texcoord0;
uniform lowp sampler2D TEXTURE_1;
uniform lowp sampler2D TEXTURE_2;
void main()
{
lowp vec4 color1 = texture2D(TEXTURE_1, var_texcoord0.xy);
lowp vec4 color2 = texture2D(TEXTURE_2, var_texcoord0.xy);
gl_FragColor = color1 * color2;
}

sampler2D déclaré dans le shader de fragments.WRAP_MODE_REPEAT répète les données de texture en dehors de l’intervalle [0,1].WRAP_MODE_MIRRORED_REPEAT répète les données de texture en dehors de l’intervalle [0,1], mais une répétition sur deux est inversée en miroir.WRAP_MODE_CLAMP_TO_EDGE ramène les valeurs supérieures à 1.0 à 1.0 et les valeurs inférieures à 0.0 à 0.0 pour les données de texture—les pixels du bord sont donc répétés jusqu’à la limite.Default utilise l’option de filtrage par défaut spécifiée dans le fichier game.project, sous Graphics, par les paramètres Default Texture Min Filter et Default Texture Mag Filter.FILTER_MODE_NEAREST utilise le texel dont les coordonnées sont les plus proches du centre du pixel.FILTER_MODE_LINEAR calcule une moyenne linéaire pondérée du bloc de texels 2x2 les plus proches du centre du pixel.FILTER_MODE_NEAREST_MIPMAP_NEAREST choisit la valeur du texel le plus proche au sein d’un seul mipmap.FILTER_MODE_NEAREST_MIPMAP_LINEAR sélectionne le texel le plus proche dans les deux mipmaps les plus adaptés, puis effectue une interpolation linéaire entre ces deux valeurs.FILTER_MODE_LINEAR_MIPMAP_NEAREST effectue une interpolation linéaire au sein d’un seul mipmap.FILTER_MODE_LINEAR_MIPMAP_LINEAR utilise l’interpolation linéaire pour calculer la valeur dans chacun des deux mipmaps, puis effectue une interpolation linéaire entre ces deux valeurs.Lorsque le pipeline de rendu dessine, il récupère les valeurs des constantes dans le tampon de constantes par défaut du système. Vous pouvez créer un tampon de constantes personnalisé pour remplacer les constantes par défaut et définir les variables uniformes du programme de shader par programmation dans le script de rendu :
self.constants = render.constant_buffer() -- <1>
self.constants.tint = vmath.vector4(1, 0, 0, 1) -- <2>
...
render.draw(self.my_pred, {constants = self.constants}) -- <3>
tint sur un rouge vifNotez que les constantes du tampon sont référencées comme dans une table Lua ordinaire, mais que vous ne pouvez pas parcourir le tampon avec pairs() ou ipairs().