Opengl multitexturing->melanger 2 textures

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 15 janv. 2006 à 00:54
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 - 27 janv. 2006 à 22:00
bonjour,



C'est la deuxieme fois que je poste pour le multitexturing mais cette fois ci ca se precise...

voila mon probleme:



J'essais , de melanger deux textures ( herbe et terre par exemple) en
prametrant de degré de melange grace a la couleur d'une troisieme
texture en niveau de gris.



voila la texture terre et la texture herbe:





je veux les melanger en parametrant le melange grace a la couleur de cette 3eme texture:





et obtenir ca:







Mais le probleme c'est que je vois pas comment faire sous opengl...



voila ce que je fais pour realiser ca, mais tout ce que j'obtiens c'est
le produit des textures 0 et 2 sur la map et non le produit de 0 et 1
avec comme facteur de melange la coulouleur de 2



donc ici la texture nom[0] est la terre


nom[1] est l'herbe


nom[2] est la texture en niveau de gris



voila le code permetrant de parametrer le mode d'application des textures:

________________________________________________________________________________


glActiveTextureARB( GL_TEXTURE0_ARB );

glEnable( GL_TEXTURE_2D );


glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);

glBindTexture(GL_TEXTURE_2D,nom[0]);


glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);


glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);




glActiveTextureARB( GL_TEXTURE1_ARB );

glEnable( GL_TEXTURE_2D );


glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS );

glBindTexture(GL_TEXTURE_2D,nom[1]);


glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );

glBindTexture(GL_TEXTURE_2D,nom[2]);


glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_TEXTURE );


glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );


glTexEnvi( GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_MODULATE );

________________________________________________________________________________

7 réponses

KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 janv. 2006 à 11:13
Salut, a mon avis tu es obligé de faire un algo en 2 passes.

Soit HERBE l'image d'herbe, TERRE l'image terre, DEG l'image degradé et qui sera appliqué à HERBE, DEG_INV l'image dégradé inversé, appliqué à TERRE et RESULT l'image finale.

on a RESULT = (HERBE*DEG + TERRE*DEG_INV) / 2

Algo :
-> première passe, appliquer HERBE*DEG (2 unité de texture...)
-> deuxieme passe, appliquer TERRE*DEG_INV avec une fonction de mélange qui fasse la moyenne...

Autre solution :
Connaissant tes images, pré-calcule les textures mélangées, en live dans le prog ou en tant que data du prog et applique les directement en simple passe et sans multi-texturing

KeniiyK
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 janv. 2006 à 13:28
Le multi texturage peut faire ce dégradé, mais comme j'arrive meme pas à utiliser cet ARB de ... je peux pas tester.
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
19 janv. 2006 à 19:10
Je pense que le plus simple est de faire un fragment shader...
genre :

uniform sampler2D myTexture0;
uniform sampler2D myTexture1;
uniform sampler2D myTexture2;


void main (void)
{
vec4 texval0 = texture2D(myTexture0, vec2(gl_TexCoord[0]));
vec4 texval1 = texture2D(myTexture1, vec2(gl_TexCoord[1]));
vec4 texval2 = texture2D(myTexture2, vec2(gl_TexCoord[2]));

gl_FragColor = texval2*0.5*(texval0 + texval1);
}

et pour chaque vertex tu charges les propriétés de tes textures
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0, 1.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0, 1.0);

mais bon faut que ta carte supporte les shaders v1
si elle supporte le multitexturing elle devrait aussi connaitre ca de toute facon

++
ad

_______________________

Omnia vincit labor improbus
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
20 janv. 2006 à 22:31
Moui ca c'est pas certain que ma carte graphique supporte ca...et puis
j'ai envie que ca soit supportable sur plein de configs...

Et c'est quoi ce gl_FragColor ??



Keniiyk> c'est vrai qu'au pire je peux faire ca... je vais essayer me mettre ca en place.



Merci a tous!
0

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

Posez votre question
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
20 janv. 2006 à 23:52
bon en fait j'vais deja essayé ca mais je pensais plus que c'est pas possible...

En effet je peux pas multiplier l'herbe avec la texture en niveaux de
gris, puis a coté multiplier la texture sol avec la texture de niveaux
de gris en negatif pour ensuite les ajouter....

opengl permet seulement d'utiliser le fragment precedent ( affiché a
l"ecran) ou bien une texture pour le (la) multiplier avec une autre
mais en utilisant source0 et source1

En clair je peux pas faire source0 + source1*source2

ou source0 serait le fragment precedent (deja dans le frame buffer, c a
dire herbe*niveaux de gris) , source1 la texture sol et source2 la
texture en niveau de gris en negatif....

Mais que source0*source1 ou source0 +source1 ( et bien d'autres choses qui sont pas interessantes ici...)



Bref c'est difficile a expliquer et dur comprendre pour ceux qui sont pas dedans...
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 janv. 2006 à 09:32
Salut,
"En clair je peux pas faire source0 + source1*source2" , si justement avec un algo en deux passe (ce qui correspondrai au signe +...)

KeniiyK
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
27 janv. 2006 à 22:00
oui mais avec les cartes graphiques actuelle il doit avoir moyen avec
les extensions de opengl de faire ca en une seule passe...donc je
cherche toujours.
0