Translation Starman / Antichok Email : codefr@planet-d.net Salut les codeur ! C'est Sqrt(-1) qui vous parle .De nos jour pas mal de demos ont des Bump mapping en 2d (effet sue lequel une lumiere se balade sur une surface perturbé ) . C'est pour ca que j'ai decidé d'ecrire quelque chose sur cela . Comme vous le verez bientot j'ai convertit ma page en article et en code source . J'espere que vous apprecierai cela ,allez visiter : http://www.sci.fi/~zaphod Pour faire un VRAI bump 2d il faut d'abord calculer les normals de chaque pixel dans une "bump map" (une image representant la hauteur des pixel) et pour chaque pixel prendre le prduit de la source de lumiere et de cette normal (la normal a la surface ) Ceci est bien sur affreusement lent et n'est pas agragle a regarder en plus . Mais comment faire ? La reponse est simple : si nous connaisson le X et le Y de la normal nous pouvons aloes calculer son Z (les normal sont des vecteur unitaire. Alors son Z est alors 1-sqrt(X^2+Y^2) ). Puis nous calculons la valeur de la lumiere pour chaque X et Y et nous la placerons dans une map (qui fait normalement 256x256) . Ce genre de map est appeler "environment map". Voila un bout de code pour calculer cette environment map : for (int y=0;y<256;y++) for (int x=0;x<256;x++) { float nX=(x-128)/128; float nY=(y-128)/128; float nZ=1-sqrt(nX*nX + nY*nY); if (nZ<0) nZ=0; enviromentmap[x][y]=nZ*256; } Bien sur vous pouvez utiliser un model d'illumination de type phong ... Alors , en prenant la valeur a : enviromentmap[normalx+128][normaly+128] (si les normal sont en "9.7 fixed point format") nous aurons la bonne valeur de la lumiere si la source de la lumiere est a <0,0,-infini> . Ceci , bien que correcte , n'est pas ce que l'on veut . Nous voulons que la source lumineuse bouge sur la sur face . Normalx est just la difference de hauteur de 2 pixel proche sur l'axe des X : normalx = bumpmap[x+1][y] - bumpmap[x-1][y] et pour normaly pn fait bien sur : normaly = bumpmap[x][y+1] - bumpmap[x][y-1] Et maintenant vient la partie la plus facile :) Nous prenons simplement la valeur depuis : enviromentmap[(normalx-(lightx-currentx))][(normaly-(lighty-currenty))]. Vous devez biensur verifier si NormalX et NormalY sont dans le bon intervalle (en general entre 0 et 255); pour cela : if (nX<0 || nX>255) nX=0; if (nY<0 || nY>255) nY=0; Mainetenant un simple bout de code pour un mapper de bump 2d : for (int y=0;y<200;y++) for (int x=0;x<320;x++) { int nX=bumpmap[x+1][y]-bumpmap[x-1][y]; int nY=bumpmap[x][y+1]-bumpmap[x][y-1]; int lX=x-lightx; int lY=y-lighty; nX-=lX; nY-=lY; nX+=128; nY+=128; if (nX<0 || nX>255) nX=0; if (nY<0 || nY>255) nY=0; screen[x][y]=enviromentmap[nX][nY]; } Translation Starman / Antichok Email : codefr@planet-d.net