IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Paramétrage du multitexturing : image trop sombre


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut Paramétrage du multitexturing : image trop sombre
    Bonjour à tous
    Je suis en train de faire un petit logiciel de génération de terrain en me fondant sur les excellents tutoriels disponibles sur le site (A. Vallée, JC Beyler).
    Au moment de faire mon multitexturing, je suis en grande souffrance.
    Sans la texture de détail tout va bien, l'affichage est correct. Par contre dès que la texture de détail est activée (sans même être "bindée"), l'image devient tout de suite plus sombre. Le bind et l'affichage qui s'ensuivent ne changent rien au problème (même si le multexturing est effectivement correct d'un point de vue texture de détail)
    Voici un petit bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    void HeightMap::CreateDisplayList()
    	unsigned int k=0,l=0;
    	double wh = 0.5; // on affiche dans la heightmap sur un plan carré de centre O et de côté 1 (de -0.5 à 0.5 en x et y
    	double pas = 1./m_size; // m_size vaut 256, c'est le nombre de points de la heightmap
     
    	m_displayListHeightMap = glGenLists(1);
     
    	glNewList (m_displayListHeightMap, GL_COMPILE);
     
    	glColor3f(1.0,1.0,1.0);
     
    	glActiveTextureARB(GL_TEXTURE0_ARB); // texture de la heightmap avec ombres précalculées par raytracing
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D, m_finalTex.GetId()); 
     
    	glActiveTextureARB(GL_TEXTURE1_ARB); // texture de détail en niveaux de gris : http://www.web3d-fr.com/tutoriels/modelisation/Textures1/detail.jpg
    	glEnable(GL_TEXTURE_2D);
    	glBindTexture(GL_TEXTURE_2D, m_detail.GetId());
     
    	glBegin(GL_TRIANGLES);
    	for(double i = -wh; i < wh-pas ; i+=pas)
    	{
    		for(double j = -wh; j < wh-pas ; j+=pas)
    		{
     
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+wh);  
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+wh)); 
                            glVertex3f(i,j,m_map[k][l]);
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+wh);  
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+wh));
                            glVertex3f(i+pas,j,m_map[k+1][l]);
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+pas+wh);
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+pas+wh));
                            glVertex3f(i,j+pas,m_map[k][l+1]);
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+pas+wh);
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+pas+wh));glVertex3f(i+pas,j+pas,m_map[k+1][l+1]);
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+wh,j+pas+wh);
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+wh),5.*(j+pas+wh));
                            glVertex3f(i,j+pas,m_map[k][l+1]);
    			glMultiTexCoord2fARB(GL_TEXTURE0_ARB, i+pas+wh,j+wh);
                            glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 5.*(i+pas+wh),5.*(j+wh));
                            glVertex3f(i+pas,j,m_map[k+1][l]);
    			l++;
    		}
    		l=0;
    		k++;
    	}
    	glEnd();
     
    	glActiveTextureARB(GL_TEXTURE1_ARB);
    	glDisable(GL_TEXTURE_2D);
    	glActiveTextureARB(GL_TEXTURE0_ARB);
    	glDisable(GL_TEXTURE_2D);
     
    	glEndList();
    }
    Le chargement des textures est fait de manière tout à fait classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    pour la texture de détail

    l'éclairage est désactivée ainsi que le blending
    J'imagine qu'il faut jouer avec les texenvi afin que l'image ne soit pas aussi sombre ?
    Merci d'avance pour vos suggestions

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    quel est le mode d'application de texture que tu utilises? Essaie GL_DECAL, pour ne prendre QUE les couleurs des textures sans mélanger avec la couleur de ton polygône comme le fait un GL_MODULATE.

    Est-ce que ca change quelque chose?

  3. #3
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    on peut voir la tête de la texture de détail ? Par défaut, le multitexturing va te faire de la modulation de texture, donc si la texture de détail est sombre, c'est normale que le résultat assombrisse ton rendu...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    J'avais mis dans le code source la texture de détail, effectivement assez sombre comme le suggérait Bafman
    http://www.web3d-fr.com/tutoriels/mo...es1/detail.jpg

    Finalement j'ai trouvé moi-même la solution
    Il suffit de faire un :
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
    glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 2.);

    pour la texture de détail

    En effet la mise à l'échelle RGB permet de compenser la multiplication de GL_MODULATE
    Par contre, je ne sais pas si mon facteur 2. est le bon. Si c'est le cas, quelle est la justification mathématique ?

  5. #5
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Citation Envoyé par GoldenEye Voir le message
    J'avais mis dans le code source la texture de détail, effectivement assez sombre comme le suggérait Bafman
    En effet la mise à l'échelle RGB permet de compenser la multiplication de GL_MODULATE
    Par contre, je ne sais pas si mon facteur 2. est le bon. Si c'est le cas, quelle est la justification mathématique ?
    N'oublie pas par exemple que si tes deux textures ont une valeur de 1, alors la couleur finale sera 2 ce qui est plus que ce que peut représenter ton back buffer (sauf en high dynamic range) et donc causera des problèmes de saturation dans les hautes intensité.

    Aussi si tu fais de la théorie du signal, la décomposition c'est plutot composante haute fréquence + composante basse fréquence (addition plutot que multiplication) ce qui notamment est utile pour calculer/intégrer la version basse rés (l'intégrale de la composante haute fréquence est nulle après intégration, par construction). Bien entendu l'addition simple n'empeche pas les problèmes de saturation (sauf si la texture de détail a été explicitement calculée à partir de l'image haute résolution).

    Il y a aussi l'approche moderne qui consiste à considérer la texture de détail comme encodant les normales (ou la heightmap) ce qui autorise à moduler la formule d'éclairage par pixel (la color map ne contient que l'albedo ou couleur diffuse, sans aucune donnée d'éclairage).

    Bref, il y a plusieurs pistes à explorer, tout dépend de l'avancement technologique de ton moteur, et ou si tu es satisfait du résultat que tu obtiens.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Image trop petite de linux mandriva free dvd
    Par bandit007 dans le forum Mandriva / Mageia
    Réponses: 5
    Dernier message: 10/12/2006, 17h39
  2. Haut du corps trop grand sous FF. Image trop haute sous IE
    Par Sword' dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 03/11/2006, 09h27
  3. Faire glisser une image trop grande avec la souris
    Par avogadro dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 28/07/2006, 16h50
  4. Raffraichissement d'image trop lourd
    Par ppopov dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 07/02/2006, 18h41
  5. Moniteur trop sombre
    Par Perdus dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 10/11/2005, 02h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo