chucky_666
Messages postés6Date d'inscriptionmercredi 13 avril 2005StatutMembreDernière intervention29 avril 2005
-
29 avril 2005 à 17:08
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDerniè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 :
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 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
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 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).)