Home           
Premiers shaders
 

<< Introduction aux shaders

Nous allons voir dans ce tutorial quelques shaders de base de RenderMan. Nous n'allons pas expliquer toute la théorie de l'éclairage, celle-ci est très bien expliquer dans le livre de Rémy Malgouyres : Algorithmes pour la synthèse d'images et l'animation 3D : Cours et exercices corrigés . Nous allons revoir le shader constant, le shader matte puis le shader metal et enfin le shader plastic.

Le shader constant
Le shader matte
Le shader metal
Le shader plastic

Le shader constant

Voici le code :

surface constant()
{
   Oi = Os;
   Ci = Cs*Oi;
}

Ce qui est fait dans le shader constant, c'est simplement copier l'opacité de départ Os dans l'opacité finale Oi. Ensuite la couleur finale Ci est calculée en fonction de la couleur de départ Cs et de l'opacité finale. Ainsi, l'objet garde sa couleur et devient plus ou moins transparent grâce à l'opacité.

Le fichier RIB
Le shader

Le shader matte

Jusqu'à present le shader utilisé ne donnait pas une impression de 3D. Il faut donc tenir compte de l'éclairage et de l'angle d'incidence sur la surface. Cet angle est symbolisé par le vecteur I qui part de l'oeil de l'utilisateur (la caméra) jusqu'au point d'impact de la lumière. Ce vecteur est une variable globale. Un autre vecteur important est le vecteur N qui est la normale au point de la surface.

La première chose à faire est de récupérer les normales qui pointent vers l'extérieur. Pour ce faire, voici le code à taper : normal Nf = faceforward(normalize (N),I);. Ce bout de code permet de récupérer la bonne normale.

Il faut toujours normer les normales...

Nous allons faire un shader qui ne donne que la couleur diffuse de l'objet:

surface second()
{
   normal Nf = faceforward(normalize (N),I);

   Oi = Os;
   Ci = Cs* diffuse(Nf ) * Oi;
}

Et voici le résultat:

Pour l'instant le résultat n'est pas probant. Mais on remarque la fonction diffuse qui permet la conposante diffuse de la couleur de l'objet.

Le fichier RIB
Le shader

Il faut récupérer maintenant toutes les positions pour les points de la surface. En effet, la fonction diffuse ne dépend que de Nf. I n'est donc pas encore utilisée. Pour donner du relief à l'objet, il faut prendre en compte la composante ambiente. Nous allons aussi ajouter les coefficients Ka et Kd pour pondérer la composante ambiante et la composante diffuse.

surface matte(
   float Ka = 1;
   float Kd = 1;
)
{
   normal Nf = faceforward(normalize (N),I);

   Oi = Os;
   Ci = Cs*(Ka*ambient()+ Kd*diffuse(Nf )) * Oi;
}

Et voici le résultat:

La première chose à remarquer, c'est le ; après la déclaration des paramètres. Ensuite il faut remarquer que les paramètres sont initialisés. Ainsi, si l'utilisateur ne donne pas de valeur aux paramètres, ils auront la valeur 1.

Le fichier RIB
Le shader

Le shader metal

Le shader metal va lui réfleter la partie spéculaire de la couleur de l'objet, c'est à dire le reflet. Pour cela nous allons utiliser la fonction specular. Mais il nous faudra aussi calculer le vecteur de reflection. Ce vecteur est en fait l'opposé du vecteur I. Il faudra aussi l'intensité du reflet ainsi que son étalement (roughness en anglais). Pour trouver le vecteur V, voici comment faire : vector V normalize(-I);

surface third()
{
   normal Nf = faceforward(normalize (N),I);
   vector V normalize(-I);

   Oi = Os;
   Ci = Cs* specular(Nf,V,0.1 ) * Oi;
}

Et voici ce que donne ce shader :

Le 0.1 est en fait l'étalement du reflet. On remarque que sur cette image, il n'y a que le reflet qui est visible.

Le fichier RIB
Le shader

Pour palier au problème de la non-visibilité du reflet, il faut ajouter la composante ambiente à la lumière. Voici donc le code final du shader metal :
surface metal(
   float Ka = 1;
   float Ks = 1;
   float roughness = 0.1;
)
{
   normal Nf = faceforward(normalize (N),I);
   vector V normalize(-I);

   Oi = Os;
   Ci = Cs* Oi* (Ka*ambient()+ Ks*specular(Nf,V,roughness) ) ;
}

Et voici une boule métalisée :

Nous retrouvons bien l'aspect métaliique recherché.

Le fichier RIB
Le shader

Le shader plastic

Pour l'instant nous avons créé un shader qui travaille sur le difus et un sur le spéculaire. Mais, dans la vie de tous les jours, les objets possèdent toutes ses composantes. Nous allons donc finir ici ce tutorial en créant le shader plastic.

surface plastic(
   float Ka = 1;
   float Kd = 0.5;
   float Ks = 0.5;
   float roughness = 0.1;
   color specularcolor = 1;
)
{
   normal Nf = faceforward(normalize (N),I);
   vector V normalize(-I);

   Oi = Os;
   Ci = Oi*(Cs* (Ka*ambient() + Kd*diffuse(Nf )) + specularcolor*Ks*specular(Nf,V,roughness) ) ;
}

Et voici une boule en plastique :

Un nouveau paramètre a fait son apparition : specularcolor. Ce paramètre va permettre de changer la couleur du reflet. Sa valeur par défaut est 1, c'est à dire blanc.

Le fichier RIB
Le shader

 

<< Introduction aux shaders
  eXTReMe Tracker