Writing Your First Shader

Transcription

Writing Your First Shader
Ecrire votre 1er Shader
Contenu:
Introduction
Mise en place
Ecriture de notre 1er shader!
Importation et Test
Introduction
Vous êtes arrivés au tutorial 2! Là où les choses sérieuses commencent;
on va pouvoir mettre toutes nos récentes connaissances acquises à
l’épreuve. On va commencer par créer un simple shader qui agira sur un
objet texturé. Nous verrons cela dans RCP, dans un 1er temps, avant que
nous ne commencions à ajouter l’éclairage par la suite.
Vous aurez besoin de connaissances basiques en scripting ou en
programmation afin de comprendre ce tutoriel. Si vous ne comprenez pas
le système des functions, includes et data types alors j’ai peur que ce
tutorial soit un peu trop complexe.
Mise en place
Tout d’abord, vous devez créer un nouveau fichier .fx. Si votre système
d’exploitation affiche les extensions (bien souvent masquées), alors créez
un simple document text .txt et renommez l’extension en .fx
Sinon, vous pouvez également prendre un shader déjà existant dans le
dossier de votre projet et en faire une simple copie que vous renommerez
en “tutorial2”. Double cliquez sur le fichier et associez le à notepad (je
vous déconseille d’utiliser WordPad qui n’affiche pas le numéro des
lignes). Je ne décrirai pas non plus comment utiliser les IDEs des shaders
dans ce tutorial; notepad est le mieux adapté à ces effets.
Ecriture de notre 1er shader!
Tout d’abord, nous devons inclure le fichier d’en-tête BBDX ; ça nous
fournit des fonctions utiles pour les textures, lumières et brouillard.
En plus, Nous utiliserons une de ses macros pour importer une texture.
// Include RCs helpers
#include "Include\BBDXInclude.fxh"
ImportTexture0
Le “0” fait référence au 1er index des textures du model; qui est
normalement utilisé en tant que diffuse map. Ensuite, intervient une
constante importante pour l’importation.
// Constants
float4x4 WorldViewProjection : WorldViewProjection;
Dans le tuto précédent, je parlais de la transformation des vertex de
l’espace objet vers l’espace écran.
Realm Crafter nous le propose dans sa matrice, nous devons donc le faire;
ça pré-multiplie les matrices du World, View et de la Projection (voir le
screen).
Avant d’entamer le code principal, nous devons déclarer une structure du
vertex. BBDXInclude a déjà préparé la structure de l’input; il ne nous
reste plus qu’à déclarer l’output.
// Vertex Output Declaration
struct VSOut
{
float4 Position
: POSITION;
float2 TexCoord
: TEXCOORD0;
};
Nous devons définir en output une position nécessaire, et il faut
également définir une coordonnée de texture afin de l’utiliser pour
texturer. Ensuite, nous devons créer notre vertex shader (VS); la 1ere
partie consiste à déclarer notre fonction, en incluant ses données en input
et en output.
// Vertex shader
VSOut vs_main(VSStandard In)
{
Comme nous le ferions avec d’autres programmes, nous utilisons un type
return de notre structure en output et un paramètre, In, avec un input
BBDX par défaut.
// Setup our output variable
VSOut Out;
// Copy our input texture coordinate to the output
Out.TexCoord = In.TexCoord;
Ce segment n’as pas vraiment besoin de description. Tout ce qu’il fait c’est
créer une variable en output (sur laquelle nous reviendrons plus tard) et
copier la coordonnée de texture de l’input vers l’output.
La partie suivante est la partie la plus complexe du shader; nous
transformerons la position de l’objet dans l’espace en position d’écran.
// Transform our object space vertex to screen space
Out.Position = mul(In.Position, WorldViewProjection);
La commande “mul” signifie “multiplier”. Nous l’utiliserons pour multiplier
notre vecteur (float4 In.Position) avec la matrice qui contient la
transformation du world, view et projection.
Out.Position contient les coordonnées 2D du vertex. Enfin, nous
retournons à la structure de notre ouput et nous fermons les functions.
// Done, return our structure
return Out;
}
Ensuite, nous écrivons notre pixel shader (ps). Cette fois nous renvoyons
une simple valeur float4, ce sera la couleur (et l’alpha) du pixel. Out input
sera l’output de la fonction vertex shader (VS). Nous déclarerons
également une variable temporaire comme nous l’avons fait dans le vertex
shader.
// Pixel Shader
float4 ps_main(VSOut In) : COLOR0
{
// Setup out output color
float4 Out;
Vous constaterez que nous utilisons la sémantique COLOR0 sur la
fonction; ça informe le GPU que nous allons utiliser un output de couleur
dans la partie principale de l’écran.
Notre pixel shader doit effectuer une recherche sur la texture en utilisant
les coordonnées de l’input texture. Un texture lookup nous permet de
manipuler la fonction “tex2D”.
// Read our texture into the output
Out = tex2D(Tex0, In.TexCoord);
La fin de la fonction pixel est la même que celle du vertex shader.
// Done, return the color
return Out;
}
Maintenant il ne nous reste plus qu’a écrire notre technique et notre passe
qui indiquera au compiler quelles sont les fonctions de shader. Les noms
de technique et de passe n’ont pas d’importance dans Realm Crafter; il
prendra la 1ere technique qu’il trouvera.
// Technique
technique OurTechnique
{
// Pass
pass Pass0
{
VertexShader = compile vs_2_0 vs_main();
PixelShader
= compile ps_2_0 ps_main();
}
}
C’est fait! Il ne nous reste plus qu’à l’importer et à le tester dans le
moteur.
Importation et Test
Pour importer notre effet; on ouvre le GE et on clique sur l’onglet media.
On clique sur “Manage Shaders and Profiles” et en dessous la liste
“Shaders”, cliquez sur “New”. Localisez votre fichier et renommez-le
“Tutorial 2”.
Maintenant que le shader est importé, on doit lui créer un profil. Si votre
shader est complexe, il n’y a aucun intérêt à l’utiliser sur un objet lointain
ou sur un ordi avec une config peu puissante. U profil permettra de
basculer automatiquement le shader à une version moins détaillée si le
joueur est loin, ou s’il a choisit de jouer avec un niveau de détail bas. Pour
le moment, on ne s’en occupera pas, on va simplement créer un profil qui
utilisera notre shader « Tutorial 2 » en permanence.
Donc, cliquez sur “New” en dessous de la liste des profils. Renommez
votre profil “Tutorial 2”, et sélectionnez votre shader “Tutorial 2”. Ne vous
souciez pas des checkboxes ou du scale. Sauvegardez et fermez l’éditeur
de profil, ensuite refermez le shader manager.
Depuis le media manager, selectionnez un objet texturé et choisissez le
profil “Tutorial 2” dans la liste. Cliquez sur le world editor et placez le dans
la zone.
Voila le résultat sur ma sphère par défaut:
Vous devriez avoir le même résultat que le mien; ce qui signifie que vous
pouvez passer au tuto suivant où nous apprendrons à améliorer ce shader
pour lui donner plus de luminosité.
Si vous avez le moindre souci, vous pouvez télécharger le shader final:
tutorial2.fx
Realm Crafter is a registered trademark of Solstar Games, LLC.
Tutorial content may not be copied without permission.
Traduit par Giuliani (Terrier) avec l’aimable autorisation de Solstar Games, LLC.

Documents pareils