Les shaders sont un outil incroyablement puissant pour manipuler quoi et comment les choses sont rendues à l'écran par la carte graphique. Comme ces petits programmes sont en fait exécutés sur la carte graphique elle-même, cela signifie qu'ils sont extrêmement rapides à traiter, ce qui libère de précieux cycles CPU pour une plus grande logique de jeu.
Pour créer un shader, vous devez avoir écrit à la fois un Vertex Shader et un Shader de fragmentation (également appelé Pixel Shader ) à l'aide de l' éditeur Shader, et même si (par exemple) vous souhaitez seulement modifier les positions de vertex pour une instance dessiné, ou si vous voulez seulement changer les valeurs de couleur pour les pixels, vous aurez toujours besoin des deux programmes pour qu'un shader complet fonctionne.
Pour une vue d'ensemble complète des fonctions et des variables GLSL ES disponibles que vous pouvez utiliser pour programmer les shaders eux-mêmes, reportez-vous aux pages de référence du langage d'ombrage OpenGL ES (GLSL ES). Le lien suivant est également utile car il contient des cartes de référence rapide pour OpenGL ES Api (notez que seules les deux dernières cartes présentées sont applicables à GameMaker Studio 2 ): Cartes de référence OpenGL ES.
Une fois que vous avez créé votre shader, l'utiliser est très simple et nécessite seulement quelques lignes de code pour en tirer le plus basique:
shader_set(myShader);
draw_self();
shader_reset();
Comme vous pouvez le voir, ils sont utilisés de la même manière pour fusionner les modes et les surfaces, où vous sélectionnez d'abord (fixez) le shader, dessinez ce que vous voulez en l'utilisant, puis réinitialisez à nouveau la cible du tirage par la suite. Si vous souhaitez rendre le plein écran via un shader, et pas seulement un seul sprite ou arrière-plan, vous devrez configurer une surface pour attraper la vue actuelle, puis la passer dans le shader (voir Surfaces pour plus d'informations).
Si le shader que vous utilisez a des valeurs d'entrée, celles-ci sont définies à l'aide des fonctions uniformes. Vous obtiendrez d'abord la poignée uniforme (qui est essentiellement une valeur ID pour l'uniforme à définir) en utilisant la fonction shader_get_uniform() dans l' événement de création de l'instance en utilisant le shader, puis stockez ces poignées dans des variables, quelque chose comme ceci:
colour_to_find = shader_get_uniform(sShaderDemo5,
"f_Colour1");
colour_to_set = shader_get_uniform(sShaderDemo5,
"f_Colour2");
Une fois que vous avez les poignées d'uniforme, elles peuvent ensuite être définies dans le code de shader pour l' événement de dessin comme ceci:
shader_set(sShaderDemo5);
shader_set_uniform_f(colour_to_find, 1,1,1 );
shader_set_uniform_f(colour_to_set, 1,0,0 );
draw_sprite(sprite_index,image_index,x+24, y);
shader_reset();
Une dernière chose à noter est que même si les shaders sont acceptés sur toutes les plates-formes, ils sont toujours spécifiques à l'appareil et si le matériel ou le logiciel de l'appareil ne peut pas utiliser de shaders, vous obtiendrez une erreur. Par conséquent, il est recommandé de vérifier que le shader a été compilé avant de définir des uniformes ou d'utiliser le shader lui-même, comme ceci:
if (shader_is_compiled(myShader))
{
shader_set(myShader);
draw_self();
shader_reset();
}
else show_debug_message("Shader failed");
En tant que vérification supplémentaire, vous pouvez également appeler la fonction shaders_are_supported pour voir si le matériel supporte même les shaders. En général, vous ferez ces vérifications au début du jeu et stockerez les résultats sous forme de variable globale pour ensuite vérifier plus tard.
Il est important de noter que GameMaker Studio 2 prend également en charge certaines macros de compilation conditionnelles qui peuvent être utilisées dans les shaders GLSL ES afin de pouvoir exécuter du code alternatif sur des plates-formes prises en charge spécifiques. Les macros et les plates-formes sur lesquelles elles seront générées sont indiquées dans le tableau ci-dessous:
| Shader Macro | Valeur | Plate-forme cible |
|---|---|---|
| _YY_GLSLES_ | 1 | Toutes les plates-formes cibles |
| _YY_GLSL_ | 1 | Mac et Ubuntu (Linux) |
| _YY_HLSL11_ | 1 | Windows, UWP, XboxOne |
| _YY_PSSL_ | 1 | PS4 |
Lorsque vous compilez votre projet GameMaker Studio 2 sur l'une des plateformes listées à l'aide d'un shader de format GLSL ES, l' une des macros ci-dessus sera générée et pourra être utilisée dans le shader comme ceci:
#ifdef _YY_HLSL11_
// HLSL shader code here
#else
// GLSL shader code here
#endif
Les fonctions suivantes sont disponibles pour dessiner et définir des shaders:
- shader_set
- shader_get_uniform
- shader_get_sampler_index
- shader_set_uniform_f
- shader_set_uniform_f_array
- shader_set_uniform_i
- shader_set_uniform_i_array
- shader_set_uniform_matrix
- shader_set_uniform_matrix_array
- shader_reset
- shader_is_compiled
- shaders_are_supported
- shader_current
Nous avons également une fonction spéciale qui définit un état global pour tous les shaders:
Lorsque vous travaillez avec des échantillonneurs de texture dans des shaders, vous aurez besoin d'informations sur la texture utilisée, auquel cas vous pouvez utiliser les fonctions suivantes:
Bien que ce manuel ne couvre aucune des fonctions et variables de shaders d' GameMaker Studio 2, il contient une liste de celles qui sont propres à GameMaker Studio 2. Ces constantes ne font pas partie de la spécification Open GL pour les shaders et sont fournies pour simplifier l'intégration des shaders dans vos projets.
Enfin, GameMaker Studio 2 vous permet de définir vos propres formats de sommet à partir desquels vous pouvez créer vos propres primitives personnalisées. Cela peut grandement accélérer les opérations de shader ou peut être utilisé pour étendre leurs capacités et créer des effets surprenants. Vous pouvez trouver des informations à ce sujet dans les sections suivantes: