Algo de colorisation

chucky_666 Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 29 avril 2005 - 29 avril 2005 à 17:08
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 1 mai 2005 à 17:07
G une scene openGL comprenant un terrain 3D et je voudrais attribuer une couleur a mes triangles en fonctions de l'altitude Z de ceux-ci :

Genre :
bleu = eau
vert = plaine
rouge = montagne ....

G bien essayé de faire avec plusieurs if (Z > 5000) && (Z <7500)... mais au niveau des transitions de couleurs c pa tres joilie !!!!

Est-ce kelkun connait un algo simple et rapide fonction de z pour collorer un terrain?

Merci

6 réponses

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
29 avril 2005 à 19:43
Salut!

Perso, je cherche aussi toute sorte d'algo style dégradé de couleurs, donc si qqun a une réponse, cela m'aiderais aussi

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
29 avril 2005 à 21:53
J'ai fais exactement ce truc la semaine derniere....
En gros :

- Definir une echelle de couleur -> une ligne de couleur fondues. Je me suis fais ca vite fait avec Qt, c a d un prog avec X parametres qui me sort un fichier de 256 couleurs degradées (si ca peut vous donner des idées).

- Pour faire un fondu entre 2 couleurs RGB par exemple :
(R1,G1,B1) couleur 4 du tableau et (R2,G2,B2) couleur 13 du tableau, on veut calculer les couleurs 5 à 12 :
for(i=5;i<13;i++)
{
Rcouleur[i]=((i-4)*R2+(13-i)*R1) / (13-4) // interpolation linéaire sur le rouge
// idem pour les autres composantes
}

- Attribuer la couleur aux sommets et pas seulement la meme au triangle, car OpenGL fais les degrades tout seul sur le triangle.

KeniiyK
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
29 avril 2005 à 23:13
Salut,





Si vous avez une carte graphique programmable, le plus simple est de faire un shader.


Les dégradés seront parfaits car la couleur est calculée pour chaque pixel.





Autre façon:


Comme l'a fait remarquer KeniiyK, la carte graphique interpole les couleurs sur les faces d'aprés les couleurs des vertex.

Donc les dégradés sont "automatiquement fais".




Good luck!





Guillaume
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
30 avril 2005 à 13:47
Et j'ai oublié de dire autre chose :
Une fois fait la ligne de couleurs dégradées, vous attribuez la couleur 256 (255 dans un tableau) au Z le plus haut et la couleur 1 (0 dans un tableau) au Z le plus bas. Pour les Z intermédiaires vous refaites une interpolation linéaire par exemple :
CouleurZIntermediaire = ( CouleurZHaut*(Zintermediaire-Zbas) + CouleurZBas*(ZHaut-Zintermediaire) ) / (ZHaut-ZBas);

Galmiza-> je vois pas trop l'utilité de faire un shader dans ce cas, les dégradés de bases sont déjà pas mal ?, et tu penses à faire quoi exactement comme calcul ?....

KeniiyK
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
30 avril 2005 à 14:01
A gauche le terrain, a droite le tableau de 256 couleurs....

KeniiyK
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
1 mai 2005 à 17:07
soit k=(z-Zmin)/(Zmax-Zmin)



on a:

k=0 pour z=Zmin

k=1 pour z=Zmax



on veut:

k=0 => color = (0,0,255) // bleu

k=1/2 => color = (0,255,0) // vert

k=1 => color = (255,0,0) // rouge

color = (r,g,b)



donc par exemple:

b=255*(1-2*k) si k<1/2 0 sinon

r=255*(2*k-1) si k>1/2 0 sinon

g=2*k si k<1/2 2-2*k sinon



Voila, ça devrait donner quelque chose de pas trop mal.



Après il faut retranscrire l'algo soit en C pour donner les couleurs
correspondantes pour chaque vertex, ou alors implanter l'algo dans un
pixel ou vertex shader.

(Les shaders ne sont utiles que si les Zmin et Zmax évoluent car sans
shader il faudrait mettre à jour sans arrêt les vertex en envoyant les
informations via l'AGP (pas très rapide).)
0
Rejoignez-nous