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 :

Multitexturing et shaders = problème!


Sujet :

OpenGL

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut Multitexturing et shaders = problème!
    Hello!
    Je me crée un shader de peau pour un personnage féminin (futur jeu).
    J'ai besoin pour ça de plusieurs textures utilisant les mêmes UV:
    1. albedo (couleur) de la peau + alpha
    2. gloss map, depth map, et 2 slots libres pour bricoler.
    (à l'avenir : 3. normal map, height map...)

    Mais j'ai un problème d'accès aux map depuis le shader, si j'accède à l'un je perd l'autre et vice versa.

    Les extensions multitexture sont définie et supportées.

    Voici les shaders et comment j'initialize les textures.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    varying vec3 normal, lightVec, eyeVec;
    varying vec4 position; 
    uniform vec3 lightDir;
    uniform vec3 cameraPos;
    void main()
    {    
     normal = gl_NormalMatrix * gl_Normal;
     lightVec = gl_NormalMatrix * lightDir;
     eyeVec = gl_NormalMatrix * cameraPos;
     position =  gl_Vertex; 
     gl_TexCoord[0] = gl_MultiTexCoord0;
     gl_Position = ftransform();
    }
    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
    varying vec3 normal, lightVec, eyeVec;
    varying vec4 position; 
    uniform sampler2D tex, tex1;
     
    void main()
    {   
         // gloss map, etc... 
    //     vec4 color1 = texture2D(tex,glTexCoord[0].st);
         // albedo de la peau 
         vec4 albedo = texture2D(tex1,gl_TexCoord[1].st);
         vec3 n = normalize(normal);
         vec3 L = normalize(lightVec);
     
         vec3 E = -normalize(eyeVec-position.xyz); 
     
              // ambient
         vec4 color = gl_LightSource[0].ambient * albedo; 
     
         // diffuse avec color bleeding 
         float lambertTerm = max(dot(n,L), 0.0);
         color +=  gl_LightSource[0].diffuse * vec4(lambertTerm*1.3,lambertTerm*1.1,lambertTerm,1.0);
         // speculaire
         vec3 R = reflect(-L, n);
         float specular = pow(max(dot(R, E), 0.0), gl_FrontMaterial.shininess);
         color += gl_LightSource[0].specular * specular; 
     
         gl_FragColor = color;
    }
    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
    glClientActiveTextureARB(GL_TEXTURE0_ARB);
                glTexCoordPointer(2, GL_FLOAT, 0, &uv[0]);
                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                glClientActiveTextureARB(GL_TEXTURE1_ARB);
                glTexCoordPointer(2, GL_FLOAT, 0, &uv[0]);
                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                glActiveTextureARB( GL_TEXTURE0_ARB );
                glEnable( GL_TEXTURE_2D );
                glBindTexture( GL_TEXTURE_2D, texture.at(1));
                glActiveTextureARB( GL_TEXTURE1_ARB );
                glEnable( GL_TEXTURE_2D );
                glBindTexture( GL_TEXTURE_2D, texture.at(0));
     
                GLint texture1Loc = glGetUniformLocation(program,"tex");
                GLint texture2Loc = glGetUniformLocation(program,"tex1");
          glUseProgram (program);
          glUniform1i(texture1Loc, texture.at(1));
          glUniform1i(texture2Loc, texture.at(0));
    Le problème c'est que si je "décommente" la ligne color1= texture2D...
    albedo prend ses valeurs dans l'autre texture et je n'ai plus accès à la première texture.
    ex: A. accès à une seule texture (image correcte)
    B. Accès à la 2ème texture (image foireuse)
    Images attachées Images attachées   

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2009, 04h36
  2. Réponses: 2
    Dernier message: 14/12/2007, 01h47
  3. Problème d'implémentation de shader GLSL
    Par Marco17 dans le forum OpenGL
    Réponses: 18
    Dernier message: 25/11/2007, 11h34
  4. Problème facétisation shaders
    Par Khastarax dans le forum OpenGL
    Réponses: 8
    Dernier message: 10/05/2007, 15h34
  5. Problème Transparence et Multitexturing
    Par Mehdi_Spirit dans le forum OpenGL
    Réponses: 1
    Dernier message: 06/04/2007, 09h55

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