Le modèle d'illumination de PHONG




             Salut bande de galapiats !! Me revoilou pour
        de nouvelles aventures dans le monde palpitant (bof)
                           de la démo...

    On est le 7 Octobre 1995, épi j'ai plus beaucoup de temps pour
faire cet  article  mais bon, ça va  aller, en  plus  je veux  pas
déçevoir ce cher ST SURVIVOR hein !! [Merci Patapom !]

    Comme toujours, l'orthographe un peu douteuse vient du fait ke
j'utilise RTEL  assez souvent  et qu'avec  ce RTC, c'est plutot la
rapidité ki compte  donc, pas de perte  de temps, ici la fantaisie
importe plus...

    Entre nous, j'écrirais plutot "C" ke "c'est". Ca  peut choquer
ceux ki n'y sont  pas habitués, m'enfin... Bon... Imaginez ke vous
lisiez une BD débile, moi j'aime  bien les BDs, d'ailleurs pendant
ces vacances d'été, kan on  est allés  faire les courses à Mont De
Marsan pendant la PTBF (passkeu la bouffe était à gerber), c'était
chez  Mammouth je crois... Là, kesskeu  je vois  en pénétrant dans
cette antre maléfike ?? Devinez ?? Hein ??

    Hé bien non ! Pas des rangées entières de cassoulet Toulousain
(bien k'on en ait aperçu kelkes bwouates  ki sautillaient gaiement
entre  les rayons d'où  le commentaire  de Major X: "Ben ça alors,
moi k'habite à Toulouse j'en ai jamais vu de pareilles !")

    Non ! En fait, j'ai vu, de mes yeux vu, un album de "Pifou" en
réduction... à 15 Francs ! Et  alors, non  content de  le voir, je
l'achète, et là ça y'est, je replonge dans l'univers communiste de
Pif Gadget et ses amis... Le titre  kelke peu  évocateur du susdit
album - Glop Glop Gloper - me rendait d'ores et déjà tout chose...

    Ah !! Pif Gadget... Hercule, Dicentim, Bougredane, Supermatou,
Ludo, Horace  cheval de l'ouest, Les rigolus, le  prof Belpomme et
Krapulax, Rahan... Toute ma jeunesse ! (7 Francs tous les  mardis)
Ne rigolez pas !

    Ainsi, on peut s'exclamer: VIVE LES SUPERMARCHES MAMMOUTH !!!!

    D'ailleurs, j'ai vu kelke chose  d'affligeant cet après-midi :
dans  ma rue  hébin y'a un sale  connard ki  écoute de la DANCE de
merde ke je déteste (Grrrr !)ki est passé avec un T-Shirt LECLERC,
Un beau, bien orange potiron... Je peux donc définitivement penser
ke la DANCE rend un tant soit peu GAGA !! J'avais déjà été pas mal
persuadé après avoir passé kelkes jours avec ce pitre de Dr SKULL.

    Hé hé, tiens, je vais le casser : Dr SKULL il est allé à DANCE
MACHINE 6 !! Sisi, j'vous jure ! Il l'a fait, fallait oser hein !!
(Remarkez, chuis bien allé voir Super Mario Bros. au ciné moi hein
et Zappy, lui, il est allé voir STREET FIGHTER c encore pire Hi hi
!! (Là c sûr, je suis mort !))

                   =================================

              Bon, je vais pas passer ma vie sur ça donc :
              COMMENCONS !!!!!!!!!! (Bande de galapiats !)

    Commencer certes, mais par koi ?? Ben, on pourrait déjà donner
le sujet  de cet  article ki  fera la joie  des petits  comme  des
grands :


     Le modèle d'illumination de PHONG (Simplifié, évidemment !)
     ===========================================================

<*> Historique :
--------------

    Monsieur PHONG (Bui Tong de  son prénom) déjà tout petit était
fasciné par la lumière, et après avoir  couché avec Marie CURIE et
taillé une bavette avec A. EINSTEIN, il mit au  point le ressort à
boudin... Fantastique invention, presque  aussi remarquable  ke le
fil à couper le beurre. Non content de sa découverte, au plus haut
point scientifik, il s'empressa  une fois de plus de révolutionner
le  monde  en mettant au  point le choubirazalédoufikus  rouge, le
seul mobile à mouvement perpetuel ! (d'ailleurs, si vous le voyez,
ramenez lui passkeu  il s'est barré par la fenetre de son labo sur
Jupiter) Et finalement, Bui Tong dont le prénom inspira un célèbre
fabricant de  pates italiennes (BUITONI), s'empressa  de repousser
les  limites de la compréhension humaine en créant son fantastique
modèle  d'illumination... enfin  bon, il a pas mal  repompé sur Mr
GOURAUD kan meme !

    NB : Les renseignements fournis plus haut pourraient ne pas
         s'avérer tout à fait exacts.


<*> Remarque :
------------

    Le "PHONG" kess keussé ??? (Bin oui, kess keussé donc ?). Vous
devriez tous, vous amateurs de démos, connaitre le Gouraud, si non
prenez n'importe  kelle  démo "à  la mode" épi  regardez, c'est ce
mode de remplissage bizarre des polygones en  faisant des dégradés
de couleurs... On  en a vu, sur ATARI, pour la première fois, dans
INTERPHASE ce célèbre jeu mythique ke j'ai toujours, bien rangé au
fond de  mon coffre  fort... J'admire  ce jeu et  encore plus  son
créateur, k'il soit loué ! Alleluja ! (Vive lui hosana !). Ensuite
le Gouraud  a dû ré-aparaitre  dans une démo, la PANDEMONIUM si je
ne m'abuse... L'historique du Gouraud sur d'autres machines que le
ST, connais po...

    Bref, le principe est bien répandu maintenant : On affecte des
intensités  lumineuses à  chaque  sommet  d'un  polygône  ke  l'on
calculera au  préalable et puis, on  interpole les  valeurs de ces
intensités selon les contours de ce polygône... Ainsi, pour chaque
ligne du polygône, on aura son "X" de gauche, son "X" de droite et
aussi son intensité lumineuse de gauche  et celle de droite. Je ne
m'étends pas sur le  principe du  remplissage  de polyône hein ! C
supposé acquis sinon écrivez moi). Il n'y a plus k'à remplir entre
les "X" de  gauche et de  droite tout  en interpolant  de meme les
intensités lumineuses  ki pourront  être directement  interprétées
comme des valeurs de couleurs du coup...

    L'objet de cet  article n'est pas  le Gouraud, mais son "grand
frère" le Phong. Bien ke plus coûteux en temps machine le résultat
est autrement plus appréciable. Le  modèle d'illumination de Phong
a été utilisé pour la 1ère fois dans  une démo en 1995, à la Party
IV au Danemark. Il est apparu en meme temps  dans la démo appellée
CONTAGION et dans la démo de NOOON.(la 1ère : NO)

    Je le sais : j'y étais !! Bref, un tonnerre d'applaudissements
pour cette  démo "CONTAGION" ki faisait  tourner la tete de Ronald
REAGAN en Phong...

    Le principe du Phong est "un brin" plus compliké  que celui du
Gouraud : au  lieu d'interpoler les  intensités lumineuses sur les
contours du polygône puis  de les interpoler  lors du remplissage,
nous allons interpoler les vecteurs normaux aux sommets.

    Tout d'abord, un vecteur normal est un vecteur orthogonal à un
support. Rappelons qu'un vecteur  normal à une face est le vecteur
"perpendiculaire" à  cette face. Le vecteur  normal est la base de
tout  calcul  d'illumination. A ne  pas confondre  avec le vecteur
normé ki est, lui, un vecteur dont la norme est 1.

    Un vecteur normal à une face se définit comme étant le vecteur
résultant  du produit vectoriel  de 2 vecteurs appartenant à cette
face...      N

             ^
             ¦
             ¦
             ¦    / Y
             ¦   /
             ¦  /
             ¦ /
             ¦/
             ---------- X


    Dans cette  figure on trouve le vecteur normal N en faisant le
produit vectoriel de X par Y:    X^Y=N en remarquant ke  Y^X=-N...

    Il est donc important  d'orienter l'espace. Il faut bien faire
attention au sens des vecteurs choisis... C'est d'ailleurs grâce à
cette propriété ke l'on sait si une face est visible  lorsque l'on
fait de la 3D...

    Par exemple pour trouver le vecteur normal à une face orientée
dans le sens trigonometrique :








                 A

                 ¦\
                 ¦ \
                ¦   \
                ¦    \
               ¦      \
               ¦       \
              ¦         \
              ¦          \
             ¦        ---- C
             ¦   -----
           B ----

    Il suffit de faire le  produit vectoriel (BA)^(BC), ce ki nous
donne un vecteur normal à ABC dirigé  vers nous (autrement dit, ki
sort de l'écran).

    Maintenant, pour trouver un  vecteur normal à un sommet, ce ki
nous intéresse le plus pour ce k'on veut faire, il suffit de faire
la moyenne de la somme des vecteurs normaux des faces adjacentes à
ce sommet... (Relisez, ce mal de tete va passer).

    Juske là tout va bien... mais là où ça se corse c'est que pour
réaliser cette illumination,on a besoin de vecteurs NORMÉS !!! (En
tout point de la surface, pas seulement sur les contours).

    L'opération de renormage est un vrai cauchemar !! C d'ailleurs
le principal problème kan on veut faire du Phong ! D'après je sais
plus kel théorème, on rennorme un vecteur en faisant :

   N' = N / ¦N¦           (¦x¦ est la norme du vecteur x)

    C'est à  dire k'il  va falloir  calculer la  norme  du vecteur
normal ki est,comme chacun sait:  ¦N¦ = SQRT(X^2+Y^2+Z^2)    (SQRT
est l'opérateur de racine carrée et X,Y,Z sont les  composantes du
vecteur N).

    Ensuite il faut diviser chaque composante par cette norme :

Nx = X /  ¦N¦
Ny = Y /  ¦N¦
Nz = Z /  ¦N¦

   Bilan : 1 Racine carrée + 3 mises au carré + 3 Divisions et
           tout cela pour un point !!

   Conclusion : on ne PEUT PAS faire de (vrai) PHONG en temps
           réel...

    Cependant, ceux ki ont  accès à un PC (ou à la démo "GERANIUM"
sur FALCON, Hé hé !!) se seront aperçus ke  y'en a  ki le font kan
meme...  Merde alors ! Komment ça se peut ?


==================================================================
    Auparavant, un petit cours d'optique :

                  Un modèle simplifié ? Pourkoi ?
                  -------------------------------

    Car le VRAI modèle d'illumination aussi utilisé dans 3D Studio
(ce célèbre soft PC ki permet de rendre des scènes réalistes), est
bien plus compliké  que celui utilisé, courament  maintenant, dans
les démos...

    En effet, le modèle  d'illumination complet  permet de gérer 3
types de rayons :

    <*> La lumière  AMBIANTE qui  est  l'intensité de  lumière que
contient la scène, c'est l'illumination globale de la scène, celle
émise par les  autres objets on  ne peut pas  la calculer car cela
nécessiterait des  calculs  trop  monstrueux, on lui  associe donc
simplement  un  facteur Ka (ki  varie entre  0 et  1). La  lumière
ambiante n'a pas de direction propre, elle est uniforme, constante
pour tout point et toute direction de l'espace.

    <*> La réflection DIFFUSE est c kon va simuler tout à l'heure,
c le seul calcul ke l'on puisse reproduire "sans trop de mal"...

    Il  faut savoir  k'un  rayon  lumineux  se propage  de manière
rectiligne et sans perte dans le vide et dans un  milieu isotrope.
Lorsqu'il rencontre  une paroi, celui-çi  peut se réfléchir  ou se
propager dans le milieu dont est faite la paroi ("réfraction"). La
diffraction n'est simulée que sur de gros systèmes car coùteuse en
temps machine.

    Mais, regardons plutôt :


                     N
     I \           ^           / R   On a : I = Rayon incident ki
        \                     /                  frappe la paroi
         \         ¦         /
          \        ¦        /             R = Rayon réfléchi, ki
           \       ¦       /              est renvoyé par la paroi
            \      ¦      /               T = Rayon transmis
             \     ¦     /                    (réfracté
              \    ¦    /                    à travers la paroi)
               \   ¦   /                 N = Normale à la paroi au
                \  ¦  /                      point considéré.
                 \ ¦ /                   O = Point d'application
                  \¦/                        de la normale N.
    _______________Y________________ Paroi
                   :¦
                 O :¦
                   : ¦
                   : ¦
                   :  ¦
                   :   ¦
                   :   ¦
                   :    ¦
                   :    ¦
                   :     ¦
                   :      ¦ T
                   :      ¦

                               ^      ^
    On constate ke les angles ION et NOR sont identiques.

    L'intensité  lumineuse du  rayon  réfléchi sera  affectée d'un
coéfficient Kd (compris entre 0 et 1) ki varie selon ke la surface
est parfaitement  réfléchissante (1) ou parfaitement  transparente
(0)

                                            ^
    Si on  considère  maintenant  l'angle (PI-NOT) ki  est l'angle
entre le rayon  transmis et la normale prolongée, on constate k'il
n'est pas identike à l'angle ION.

    D'après ceci on peut donc se référer à la loi de Descartes :

                   N1.Sin(I1) = N2.Sin(I2)

    avec N1,N2 les indices  de réfraction  des différents  milieux
(D'un côté de la  paroi, l'air (indice 1) et de  l'autre coté, une
matière  quelconque...) I1  et I2  sont les  angles  ke  font  les
différents rayons par  rapport à la normale à  la surface au point
considéré.

    Ce  que nous  allons  calculer ce sera  l'intensité  lumineuse
résultante du rayon R. On notera que, si  les vecteurs N et I sont
normés (c à dire de norme 1), l'intensité de lumière diffuse Id se
calcule comme suit :

                 --------------------------------
                 ¦ I = Kd * Id * (N*I*cos(Phy)) ¦
                 --------------------------------

    Avec Id l'intensité de la lumière diffuse (entre 0 et 1) et Kd
le coéfficient propre au type de  surface sur lakelle  le rayon se
reflète.

    Le vecteur normé I du rayon incident a son point d'application
en O et pointe  directement vers  la source de lumière. Phy est en
fait l'angle ION (entre lerayon incident et la normale)

    3ème type de rayon :

    <*> La réflection spéculaire : c'est un  calcul de  réflection
lumineuse ki dépend de  la position de  l'observateur. Je m'étends
pas la dessus passkeu c'est tout un bordel : il faut à chaque fois
recalculer le vecteur réflection  en fonction de la position de la
normale à la surface... C chiant, croyez-moi !!

    Néanmoins, j'aimerais souligner ici l'idée de Phong d'affecter
un exposant à la fonction COSinus :

                           COS(Theta)^N

    Ce ki, à l'aide de différents exposants permet de faire varier
l'importance du pinceau de lumière  spéculaire, nous l'utiliserons
néanmoins  pour tout autre  chose tout à l'heure : le calcul de la
"tache de PHONG" (je l'ai appelé comme ça...)

==================================================================

    Voilà, une  fois  ces  "quelques" notions  rappelées, on  peut
commencer à bidouiller !

    Lors de  l'affectation d'une  couleur à un  point du polygône,
non seulement il faudra  renormer le  vecteur normal  en ce point,
mais  il faudra en  plus faire un produit  scalaire de  ce vecteur
normal normé (hi hi !!) avec le vecteur ki pointe sur la source de
lumière ponctuelle :

               Couleur = Echelle_de_couleurs * (L.N)

    (L, vecteur pointant  sur la source  lumineuse N, Normale à la
surface et  l'échelle  de couleurs  est l'indice de  la couleur la
plus lumineuse (Vous avez peut-etre fait un dégradé de 16 couleurs
hébin l'échelle de couleur sera 15 (0-15))).

    Attendez, là où ça se corse  davantage c ke  le vecteur L doit
lui aussi etre normé !

    ARGH ARGHHHHH !!!!!!! Ca y'est, 2 renormages par point plus un
produit scalaire, le Phong est l'un des trucs ki bouffe le plus de
temps de mémoire de demomaker...

    Bon, on a vu ke la  masse de calculs à  effectuer est beaucoup
trop importante pour faire ça à chaque  point d'une surface. (d'un
polygône) On va donc simplifier le problème de la manière suivante


                           ~~~~~~~~~~~

    [1) On suppose la source de lumière  située à l'infini, ce qui
évite de recalculer le vecteur L à chaque point (et par conséquent
de  recalculer  sa norme !!!!)  puisque  les rayons  lumineux sont
distribués uniformément en tout point de l'espace.

------------------------------------------------------------------
 On constate donc ke L est constant car la source est à l'infini
------------------------------------------------------------------

    [2) Pour  effectuer le  produit  scalaire à  chaque  point, il
faudra faire :

                S = Nx * Lx + Ny * Ly + Nz * Lz

    avec Nx,Ny,Nz les composantes de  la normale N et Lx,Ly,Lz les
composantes du vecteur lumière L.

    Supposons  maintenant  ke la  source de  lumière soit  à notre
place (en face de l'écran koi...) alors le vecteur L ki pointe sur
cette source sera écrit :

                       ------------------
                       ¦    L(0,0,1)    ¦
                       ------------------

    et le produit scalaire s'écrira désormais :    S = Nz   !!!!!!
Ke de gain, ke de gain les amis !! Cependant, c pas encore fini !!
(Hahaha !)

    [3) Il faudra  encore  renormer le  vecteur N... c'est  encore
trés chiant ! Hé bien non, et c là k'apparait la plus grosse gruge
car d'après l'expression du produit scalaire S = Nz, on s'aperçoit
ke l'on  a rien  à foutre des  composantes sur  X et Y  du vecteur
normal... Ca nous arrange bien, regardez :

    On connait la norme finale  du vecteur N, c'est 1 puisske c un
vecteur normé. On peut donc écrire le calcul de la norme de N :

                SQRT( Nx^2 + Ny^2 + Nz^2) = 1

    Ce dont on a besoin est Nz, on retrouve donc Nz en faisant :

       Nz^2 = 1^2 - Nx^2 - Ny^2 soit finalement :

                ------------------------------------
                ¦   Nz = SQRT( 1 - Nx^2 - Ny^2 )   ¦
                ------------------------------------

    Et voilà !! On s'aperçoit donc ke pour trouver ce kon cherche,
il suffit d'exprimer le vecteur normal par ses  composantes  Nx,Ny
et l'on peut, grâceà la formule du dessus, retrouver sa composante
Nz "facilement".

    Finalement, pour  connaitre  l'intensité lumineuse  d'un point
d'une surface, connaissant Nx,Ny du vecteur normal en ce point, on
fait :

                   I = Echelle_de_couleurs * Nz

    K'est-ce ki nous  empeche, pour  chaque  valeur de Nx,Ny de la
normale de créer une table (la  tache de Phong citées plus haut, c
un nom purement arbitraire ke J'AI choisi !!) ki nous redonnera le
résultat de l'opération et ki nous évite carrément le calcul de la
racine carrée plus les mises au carrées...


    **> CONCLUSION :

    En  connaissant  les composantes X  et Y  de la  normale en un
point donné et en se référant par  rapport à une "table de Phong",
on  retrouve aisément  la couleur à  afficher (ou  l'offset  de la
texture à aller chercher si on affiche en plus une texture plus ou
moins éclairée).

    Je vous l'avais dit ke c'était facile !! Maintenant, pour ceux
ki n'ont pas remarké, trouver les composantes Nx,Ny à chaque point
ki représente en fait un offset dans la table de Phong, ca revient
à faire du mapping...

    HE OUI !!!!!! LE PHONG DES DEMOS C EN FAIT DU MAPPING AVEC UNE
TABLE DE COULEURS.

    Maintenant occupons nous de la tronche de la table à calculer.

    Si on reprend la  formule du dessus : SQRT(1-...) en supposant
ke Nx,Ny  varient  de - 64 à + 64  on  aura  une  suite de cercles
concentriques  dont le plus  brillant se  situera  au milieu et le
plus foncé aura un rayon de 64...

    Si vous essayez, vous vous aperçevrez ke c  pas mal mais comme
on se place plutôt du point de vue de l'esthétisme, moins du point
de vue mathématique, il  vaut mieux utiliser  une autre façon pour
la calculer cette table...

    C là k'intervient la formule  mise de côté tout à l'heure : le
fameux  COS^N de  môssieuh Phong, regardez, si l'on  suppose ke la
distance  est  associée à un  angle et  comme le  cosinus  est une
fonction paire, en faisant en GFA-BASIC :


Power=1

FOR y=-64 TO 64
    FOR x=-64 TO 64

        Distance=SQR(X^2+Y^2)

        IF Distance<65

            Angle=PI*Distance/(2*64)   ! L'angle varie entre -PI/2




            et +PI/2
            Color=15.999999*(COS(Angle)^Power)
            PSET(x,y,Color)

        ELSE
            PSET(x,y,0)
        ENDIF

    NEXT x
NEXT y


    En organisant la palette en un dégradé  de couleurs de 0 à 15,
selon les  valeurs de  Power vous  obtiendrez des  taches de Phong
plus ou moins ténues... N'ayez pas peur  de monter jusk'à 200 pour
Power hein !! 32 est une chouette valeur.

    Si j'ai pris des valeurs de Nx,Ny variant de -64 à +64 c n'est
pas un hasard :

    Si l'on  réalise la  table  entière, on  obtient  un  carré de
128*128, ce carré, on le place dans  un plus grand de 256*256 (une
texture de 256*256 peut etre  adressée sur un  MOT de 16 bits avec
l'octet de poids fort représentant les ordonnées et celui de poids
faible, les  abscisses). Ainsi, pour chaque  sommet d'un polygône,
on spécifiera les composantes de  son vecteur normal  en X et Y ki
seront  finalement les  coordonnées de mapping dans  la texture de
Phong... (Texture, Tache, Table de Phong, tout ça c kif-kif hein).


    Le problème, vous allez me dire, c'est qu'on gâche de la place
puiske les bords de la texture ne seront jamais utilisés, héé bien
je vous répondrai :









                     NN    NN    OOOO    NN    NN   !
                     NNN   NN   OOOOOO   NNN   NN  !!!
                     NNNN  NN  OOO  OOO  NNNN  NN  !!!
                     NN NN NN  OO    OO  NN NN NN  !!!
                     NN  NNNN  OO    OO  NN  NNNN   !
                     NN   NNN  OOO  OOO  NN   NNN
                     NN    NN   OOOOOO   NN    NN   !
                     NN    NN    OOOO    NN    NN  !!!
                                                    !


    Musclor aussi aurait dit non pour sauver ETERNIA...

    Car  tout à  l'heure on  a établit l'hypotèse ke  la source de
lumière était EN FACE de l'objet à calculer, hé bien ça m'a étonné
mais si  l'on  modifie  l'offset de  base dans  la  texture (ki se
trouve normalement au centre de celle-çi, au centre de la tache de
Phong) selon l'axe des abscisses (dans le repère lié à la texture)
on voit la lumière ki se  déplace de gauche  à droite, de meme, si
l'on modifie  l'offset selon  l'axe des  ordonnées, la  lumière se
déplace de haut en bas...

    Si l'offset  initial est à (128,128) au  centre de la texture,
le fait de le placer désormais en (128,64) donnera l'impression ke
la lumière se trouve AU DESSUS de l'objet, ainsi on peut placer la
source  de lumière (toujours située à l'infini) n'importe  où dans
l'espace et, d'après  ses  coordonnées spatiales, on  retrouve les
coordonnées dans la texture :

X = 128 * ARCTAN( Sx/Sz ) / PI
Y = 128 * ARCTAN( Sy/Sz ) / PI

    Avec Sx,Sy,Sz les  coordonnées spatiales  de la source lumière
dans  l'espace, le mieux  étant de les  récupérer en les calculant
d'après leurs coordonnées sphérikes, comme ça la lumière se trouve
toujours  à une  distance  donnée du  centre  de  l'objet  même si
théorikement elle se trouve à l'infini.

    Evidement il y'a toujours  ces cas de merde  ou Z tend vers 0,
puis il faut aussi couvrir  toute l'étendue de la texture alors ke
la  fonction ARCTANgente ne peut  couvrir k' un domaine  allant de
-PI/2 à +PI/2, il  faudra aussi,  selon le  signe de Z, changer de
formule :

    si Z>0 alors Formule normale

sinon

X=128 * (1 + ARCTAN( Sx/Sz ) / PI)
Y=128 * (1 + ARCTAN( Sy/Sz ) / PI)


    Voilà, bon, déjà on  peut  faire du  Phong avec une  source de
lumière ki  tournikote autour de l'objet, c  Mamie Nova ki va etre
contente !

(Je soupçonne Mamie  Nova d'avoir quitté le métier  de Yaourtheuse
pour reprendre le rôle de Germaine LUSTUCRU, vous savez : celle ki
joue la 9ème de Beethoven sur un camion...)

    Maintenant, je vais vous faire rire. Si vous avez compris tout
jusk'ici, le  reste va  vous paraître  tellement  RIDICULE ke vous
rirez, sisi !

    Bon, maintenant, la mode est passée du Phong-shading  au Metal
Chrome-Shading, hé  bien, j'en  ai fait  l'expérience  pendant ces
vacances d'été, ce soit  disant "Metal-shading" ki  n'a absolument
RIEN (mais alors RIEN) à voir avec le vrai Metal-shading autrement
appelé Modèle de COOK-TORRANCE, est en fait  un simple bidouillage
de la texture de Phong !!!!! Vouski avez la chance d'avoir un mode
TRUE-COLOR 16-Bits sur  Clafon, vous allez vous  en donner à coeur
joie :

    Il  suffit de  créer la  table de Phong  normalement, avec  le
cosinus à la puissance N (avec N assez grand kan meme) mais ASTUCE
SUPREME, il faut  juste  placer une  texture  derrière, un dessin,
n'importe koi, du moment ke ça soit pas du noir...

    Vous prenez une  quelconque texture de marbre, vous l'éclairez
plus ou moins selon l'amplitude  de la fonction  COSinus^N et vous
avez une chouette texture prete pour le "metal-shading"...

    Voici un p'tit programme pour créer une telle texture. Je l'ai
pas sous la main, je le refais de tete alors y'a p'tet des bugs.


==================================================================

    On charge déjà une image de 256*256 ki se prête bien à ce k'on
veut faire dans un buffer de 2*256*256 de large  (un pixel = 1 Mot
de 16 Bits en True-Color)...

    Ensuite, on applike la zoulie bouclounette :

Power=50
Amplitude=40

FOR y=-64 TO 64
    FOR x=-64 TO 64

        Distance=SQR(X^2+Y^2)
        IF (Distance<65)

            Red=DPEEK(Image%+2*(256*(128+y)+(128+x)))
            Green=(Red AND $07E0) DIV 32
            Blue=Red AND $001F
            Red=Red DIV (64*32)

            Intensity=Amplitude*(COS(Distance*PI/(2*64))^Power)

            Red=MIN(31,Red+Intensity)
            Green=MIN(63,Green+2*Intensity)
            Blue=MIN(31,Blue+Intensity)

            DPOKE
Image%+2*(256*(128+y)+(128+x)),32*(Green+2*32*Red)+Blue

        ENDIF

    NEXT x
NEXT y

    Et on sauve le résultat... J'éspère ne pas m'être planté koi !

    On obtient alors la même image qu'à  l'origine mis à part k'au
centre on a  surimposé une tache  de lumière  ki semble  augmenter
l'intensité des couleurs de la texture...

    Pour ceux ki ont  accès à un PC et ont pu  admirer la dernière
démo de NOOON : STARS (Wonders  of the world) ki a fini première à
l'Assembly 95 ou bien la  démo d'Halcyon, LIFEFORMS ki est  un peu
plus vieille, vous aurez pu  constater k'il  y'avait une réflexion
d'objets sur d'autres objets en Metal/Phong-Shading.

    Hé bien ça s'explike simplement par le fait ke si, par le plus
grand des hasards, vous affichiez  un dessin (comme un sprite) sur
la table de Phong calculée au  préalable, celui-çi serait  déformé
mais malgré tout, on aurait kan meme l'impression ke c un objet ki
se "reflète" dans la  texture, on  peut retrouver  les coordonnées
spatiales de  cet objet en  faisant la  formule inverse  de tout à
 l'heure, celle avec les ARCTANgentes là...

A   insi, pour la  démo Lifeforms, Il  suffit de  faire tourner le
petit cube rouge en dehors de l'écran, dans un petit  buffer, puis
d'afficher ce petit  buffer à la fois sur l'écran et dans la table
de Phong... C'est aussi simple ke ça... Le tout  c'est de calculer
l'endroit précis où afficher cet objet dans la table.

    Pour la STARS, la  Venus de Milo  redécorée façon Barti serait
bien trop  chiante à calculer en  temps  réel donc, c'est  à titre
purement  hypotétique   ke  je  vais  imaginer  k'avant  de  faire
aparaître l'objet sur lekel la Venus se reflète, le Codeur ôôôôôôô
combien  imaginatif à déjà  précalculé toutes  les animations  (Un
tour complet de rotation de la Venus dont  la période  de rotation
est identike à celle du mouvement  du cerceau ki tourne autour) Ce
ki se  confirme  car on peut  voir  ke la Venus  n'effectue ke des
translations  sur un plan  d'équation Z= ... (Aucun  changement de
profondeur) J'éspère  ne pas raconter  de conneries. (hypotéthikes
néanmoins).

    Ke dire de plus sinon ke devrait etre fournie avec cet article
une démonstration du Phong sur ST (et Falcon)  plus une routine de
mapping générale pour falcon ki, kelke  peu modifiée, vous évitera
déjà de perdre du temps...

------------------------------------------------------------------

    Si vous avez  des  problèmes ou ke  vous voulez  m'envoyer des
schamallows, témoignez moi votre sympathie à l'adresse suivante :

   PATAPOM From IGLOO     ou        AARDSCHOCK From HeMoroiDs
       (sur PC)                           (sur ATARI)

                       MAYAUX Benoit
                     3 Rue Jean LEBAS
                      54510 TOMBLAINE

    Les variantes Pataschock ou Aardpom sont aussi accéptées... Hi
Hi !!! Voilà, j'éspère ke vous avez aprécié cet article ki est kan
même à  la pointe  du progrès  en démos... Je tiens  à signaler ke
j'ai mis au  point la routine de  Phong-Shading de  mon côté  sans
m'inspirer des travaux des autres pour ceux ki penseraient ke j'ai
bêtement repompé la routine, ce ki se fait de plus  en plus un peu
partout, malheureusement...

    L'auteur du présent article nie toute responsabilité en cas de
folie dûe à la lecture du dit article.

Ah oui, l'adresse de Bui Tuong PHONG :  9 Allée du petit cratère
                                            123554 ZORGLUB
                                        JUPITER / Système solaire

PS : si vous avez sa vraie adresse, moi je suis preneur hein !!


----------------------------------- AaRDsChock / hMD -------------



[ Retour au sommaire ]