Renderman (Partie 3)

WB01624_.gif (281 octets) RETOUR

Les shaders : Définition

Utilisation de "shaders" pour réaliser chacune de ces taches:

  • shaders de source lumineuse,

  • shaders de surface,

  • shaders de volume.

Shader : procédure programmée (en Renderman Shading Language) qui contient individuellement un de ces processus. Elle assure le calcul de valeurs nécessaires lors d'une phase de rendu.

Renderman fournit un certain nombre de shaders standards. Il est possible d'en écrire d'autres.

Les shaders : Utilisation

L'utilisation d'un shader apparaît dans un programme Renderman comme un appel à une fonction particulière du type:

Ri..Handle RiShadeFonction...(char *name, paramlist);

Le premier paramètre est le nom du shader. La parameterlist permet la transmission des paramètres du shader. Ri..Handle permet de récupérer un handle sur le shader instancié.

Les shaders de source lumineuse

Calcul de l'intensité lumineuse et de la couleur de la lumière envoyée par une source lumineuse vers un point.

RtLightHandle RiLightSource(char *name,parameterlist);

ajoute une source lumineuse dans une scène par instanciation du shader appelé name.

 Shaders de source lumineuse prédéfinis

  • Lumière isotropique

RiLightSource("ambientelight",
          "intensity",RtFloat *intens,
          "lightcolor",RtColor color,
          RI_NULL)

  • Lumière uniforme dirigée dans une direction (soleil par exemple). de et vers définissent un vecteur donnant la direction de la lumière.

RiLightSource("distantlight",
          "intensity",RtFloat *intens,
          "lightcolor",RtColor color,
          "from",RtPoint de,
          "to",RtPoint vers,
          RI_NULL)

  • Lumière ponctuelle sans direction particulière d'émission. L'intensité reçu décroît avec le carré de la distance. La lumière est émise de position.

RiLightSource("pointlight",
          "intensity",RtFloat *intens,
          "lightcolor",RtColor color,
          "from",RtPoint position,
          RI_NULL)

  • Lumière ponctuelle émise dans une direction donnée par position et vers et qui simule un cône de lumière. L'intensité lumineuse décroît exponentiellement avec la distance angulaire avec l'axe du cône. conea donne l'ouverture du spot. distribution contrôle la décroissance. cda définit un cône d'éclairage maximum à l'intérieur du cône principal (l'éclairage décroît entre cda et conea).

RiLightSource("spotlight",
          "intensity",RtFloat *intens,
          "lightcolor",RtColor color,
          "from",RtPoint position,
          "to",RtPoint vers,
          "coneangle",RtFloat *conea,
          "conedeltaangle",RtFloat *cda,
          "beamdistribution",RtFloat *d,
          RI_NULL)

Exemples

  • Ambientlight

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RiSurface("matte",RI_NULL);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image019.jpg (25066 octets)

  • Distantlight

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RiSurface("matte",RI_NULL);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image017.jpg (23493 octets)

  • Pointlight

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RtPoint source = { 1.0F,1.7F,3.0F } ;
  RtFloat intensite = 4.0F ;
  RiLightSource("pointlight",
                "intensity",&intensite,
                "from",source,
                RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RiSurface("matte",RI_NULL);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image017.jpg (23493 octets)

  • Spotlight

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RtPoint source = { 0.0F,0.0F,-8.0F } ;
  RtPoint dest = { 0.0F,0.5F,13.0F } ;
  RtFloat intensite = 100.0F ;
  RtFloat ca = 0.11F ;
  RtFloat cda = 0.05F ;
  RiLightSource("spotlight",
                "intensity",&intensite,
                "from",source,
                "to",dest,
                "coneangle",&ca,
                "conedeltaangle",&cda,
                RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RiSurface("matte",RI_NULL);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image017.jpg (23493 octets)

Shaders de surfaces lumineuses

Les shaders de lumière prédéfinis ne permettent de créer que des lumières ponctuelles, ce qui n'est pas représentatif d'une majorité des lumières naturelles.

Renderman permet de décrire des surfaces lumineuses.

RiLightHandle RiAreaLightSource(char *name,paramlist)

De RiAreaLightSource jusqu'à la prochaine restauration de l'environnement, toute surface déclarée est ajoutée à la surface lumineuse.

Les shaders de surfaces

Appelés quand un point d'une surface est visible pour déterminer la couleur de la lumière réfléchie par ce point dans une direction particulière.

Un shader de surface peut également rendre compte de l'opacité d'une surface et peut donc autoriser la visualisation des objets situés derrière elle.

RtVoid RiSurface(char *name,parameterlist);

Paramètres pris en compte :

  • la direction, la couleur et l'intensité d'une lumière incidente

  • la couleur de la surface (RiColor())

  • l'opacité de la surface (RiOpacity())

  • l'orientation de la surface

  • la direction selon laquelle la surface est visualisée

Réflexions modélisées :

  • ambiante

  • diffuse

  • spéculaire

Shaders prédéfinis

  • Retourne la couleur et l'opacité de la surface sans tenir compte des éclairages.

RiSurface("constant",
          RI_NULL) ;

RtColor color1 = {.9F,.9F,.5F};
RtColor color2 = {.2F,.2F,.2F};
RtPoint Square[4]    =
 { {5.0F,5.0F,0.0F},{-5.0F,5.0F,0.0F},
   {-5.0F,-5.0F,0.0F},{5.0F,-5.0F,0.0F} };

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RtFloat ka = 0.1F ;
  RtFloat kd = 0.9F ;
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color2);
  RiPolygon((RtInt) 4,RI_P,
            (RtPointer) Square,
            RI_NULL);
  RiSurface("constant",
            RI_NULL);
  RiColor(color1);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image022.jpg (25066 octets)

  • Combine les réflexions ambiante et diffuse pondérées respectivement par les coefficients ka et kd de manière à générer une surface matte.

RiSurface("matte",
          "Ka",RtFloat ka,
          "Kd",RtFloat kd,
          RI_NULL) ;

RtColor color1 = {.9F,.9F,.5F};
RtColor color2 = {.2F,.2F,.2F};
RtPoint Square[4]    =
 { {5.0F,5.0F,0.0F},{-5.0F,5.0F,0.0F},
   {-5.0F,-5.0F,0.0F},{5.0F,-5.0F,0.0F} };

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RtFloat ka = 0.1F ;
  RtFloat kd = 0.9F ;
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color2);
  RiPolygon((RtInt) 4,RI_P,
            (RtPointer) Square,
            RI_NULL);
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color1);
  Go();
  RiWorldEnd();
  RiEnd();
}
Image023.jpg (22807 octets)
  • Combine les réflexions ambiante et spéculaire pondérées respectivement par les coefficients ka et ks et la rugosité r, de manière à générer une surface à apparence métallique.

RiSurface("métal",
          "Ka",RtFloat *ka,
          "Ks",RtFloat *ks,
          "roughness",RtFloat *r,
          RI_NULL) ;

RtColor color1 = {.9F,.9F,.5F};
RtColor color2 = {.2F,.2F,.2F};
RtPoint Square[4] =
 { {5.0F,5.0F,0.0F},{-5.0F,5.0F,0.0F},
   {-5.0F,-5.0F,0.0F},{5.0F,-5.0F,0.0F} };
void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RtFloat ka = 0.1F ;
  RtFloat kd = 0.9F ;
  RtFloat ks = 0.9F ;
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color2);
  RiPolygon((RtInt) 4,RI_P,
            (RtPointer) Square,
            RI_NULL);
  RiSurface("metal",
            "Ka",&ka,
            "Ks",&ks,
            RI_NULL);
  RiColor(color1);
  Go();
  RiWorldEnd();
  RiEnd();
}
Image024.jpg (16874 octets)
RtColor color1 = {.7F,.7F,1.0F};
RtColor color2 = {.2F,.2F,.2F};
RtPoint Square[4]    =
 { {5.0F,5.0F,0.0F},{-5.0F,5.0F,0.0F},
   {-5.0F,-5.0F,0.0F},{5.0F,-5.0F,0.0F} };

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RtFloat ka = 0.1F ;
  RtFloat kd = 0.9F ;
  RtFloat ks = 0.9F ;
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color2);
  RiPolygon((RtInt) 4,RI_P,
            (RtPointer) Square,
            RI_NULL);
  RiSurface("metal",
            "Ka",&ka,
            "Ks",&ks,
            RI_NULL);
  RiColor(color1);
  Go();
  RiWorldEnd();
  RiEnd();
}     
Image025.jpg (16901 octets)
  • Combine les réflexions ambiante, diffuse et spéculaire pondérées respectivement par les coefficients ka, kd et ks et la rugosité r, de manière à générer une surface à apparence plastique. La réflexion spéculaire est colorée en sc.

RiSurface("plastic",
          "Ka",RtFloat *ka,
          "Kd",RtFloat *kd,
          "Ks",RtFloat *ks,
          "roughness",RtFloat *r,
          "specularcolor",RtColor sc,
          RI_NULL) ;

RtColor color1 = {.9F,.9F,.5F};
RtColor color2 = {.2F,.2F,.2F};
RtPoint Square[4]    =
 { {5.0F,5.0F,0.0F},{-5.0F,5.0F,0.0F},
   {-5.0F,-5.0F,0.0F},{5.0F,-5.0F,0.0F} };

void main(void) {
  RiBegin(RI_NULL);
  RiFormat(400,400,1.0F);
  RiDisplay("PinDeck.tif",
            RI_FILE,RI_RGB,
            RI_NULL);
  RiLightSource("ambientlight",RI_NULL);
  RiLightSource("distantlight",RI_NULL);
  RtFloat fov = 45.0F ;
  RiProjection("perspective",
               RI_FOV,(RtPointer) &fov,
               RI_NULL);
  RiTranslate(0.0F,0.0F,6.0F);
  RiWorldBegin();
  RtFloat ka = 0.1F ;
  RtFloat kd = 0.7F ;
  RtFloat ks = 0.2F ;
  RiSurface("matte",
            "Ka",&ka,
            "Kd",&kd,
            RI_NULL);
  RiColor(color2);
  RiPolygon((RtInt) 4,RI_P,
            (RtPointer) Square,
            RI_NULL);
  RiSurface("plastic",
            "Ka",&ka,
            "Kd",&kd,
            "Ks",&ks,
            RI_NULL);
  RiColor(color1);
  Go();
  RiWorldEnd();
  RiEnd();
}

Image026.jpg (20826 octets)

Suite