Bien le bonjour.
J'ai un problème de cohabitation de textures dans mon programme JOGL.

- D'un côté j'utilise un texture de ciel plaquée sur une sphère afin de réaliser un SkyDome
- De l'autre j'effectue un bump mapping sur une surface plane avec une texture de base et une normal map.

Séparément, les deux méthodes fonctionnes, mais ensembles dans le même programme j'obtiens un merveilleux écran noir

Du côté initialisation de texture ça donne ceci :
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
 
/******************************* 
 *   TEXTURES INITIALISATION              *
 *******************************/
private void loadGLTextures(GL gl, GLU glu) throws IOException
    {   
        // Skydome texture
gl.glGenTextures(1, skyTexture, 0);   // Create one Textures
TextureReader.Texture texture = TextureReader.readTexture("sky_MD.jpg");  
gl.glBindTexture(GL.GL_TEXTURE_2D, skyTexture[0]);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB8, texture.getWidth(),texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE,texture.getPixels());
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
 
System.err.println("Texture : sky_MD.jpg "+texture.getWidth()+"x"+texture.getHeight()+" LOADED");
 
// Load Water texture
texture = TextureReader.readTexture("waterTextureHD.jpg");  
gl.glGenTextures(2, waterTexture, 0);   // Create Three Textures
gl.glBindTexture(GL.GL_TEXTURE_2D, waterTexture[0]); // Create Nearest Filtered Texture
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 3, texture.getWidth(), texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels());
gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);	// Linear Filtering
gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);	// Linear Filtering
 
System.err.println("Texture : waterTextureHD.jpg "+texture.getWidth()+"x"+texture.getHeight()+" LOADED");
 
// Load The Bumpmaps
texture = TextureReader.readTexture("waterTextureHDNormalMap2.jpg");  
gl.glBindTexture(GL.GL_TEXTURE_2D, waterTexture[1]); // Create Nearest Filtered Texture
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB8, texture.getWidth(), texture.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, texture.getPixels());
gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);	// Linear Filtering
gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);	// Linear Filtering
 
System.err.println("Texture : waterTextureHDNormalMap.jpg "+texture.getWidth()+"x"+texture.getHeight()+" LOADED");
 
gl.glActiveTexture(GL.GL_TEXTURE1);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, waterTexture[1]);
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_COMBINE);
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_COMBINE_RGB, GL.GL_DOT3_RGB) ;
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_SOURCE0_RGB, GL.GL_PREVIOUS) ;
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_SOURCE1_RGB, GL.GL_TEXTURE) ;
 
gl.glActiveTexture(GL.GL_TEXTURE2);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, waterTexture[0]);
gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
    }

Ensuite dans mon display() je commence par la création du skydome :

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
 
/** Skydome display
 * Create a glu sphere and map sky texture
 */
 
gl.glPushMatrix();
gl.glDisable(GL.GL_LIGHTING);
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, skyTexture[0]);
glu.gluQuadricOrientation(g_quadratic, GLU.GLU_CW);
glu.gluQuadricNormals(g_quadratic, GLU.GLU_SMOOTH);
glu.gluQuadricTexture(g_quadratic, true);
glu.gluQuadricDrawStyle(g_quadratic, GLU.GLU_FILL);
gl.glTranslatef(poscam.getX(), poscam.getY(), poscam.getZ());
gl.glRotatef(-90f, 1.0f, 0f, 0f);
 
glu.gluSphere(g_quadratic,far,50,100);
gl.glPopMatrix();
gl.glEnable(GL.GL_DEPTH_TEST);
 
gl.glDepthMask(true);
Ensuite pour le texturage de la surface j'effctue ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBegin(GL.GL_QUADS);
gl.glMultiTexCoord2f(GL.GL_TEXTURE1, xTextureCoordinate*10-textureMotion,yTextureCoordinate*10-textureMotion);
gl.glMultiTexCoord2f(GL.GL_TEXTURE2, xTextureCoordinate*10+textureMotion,yTextureCoordinate*10+textureMotion);
gl.glVertex3f(oceanMesh.elementAt(temp).elementAt(temp2).getX(),oceanMesh.elementAt(temp).elementAt(temp2).getY(),			  oceanMesh.elementAt(temp).elementAt(temp2).getZ());
 
// Idem pour les trois autres point du QUAD
 gl.glEnd();
D'un côté j'ai donc un simple bind de texture, de l'autre j'ai deux texture unit GL_TEXTURE1 et GL_TEXTURE2.
Donc je cherche un moyen de spécifier la bonne texture à appliquer et de désactiver temporairement les autres.

Merci d'avance à ceux qui prendrons le temps de m'aider, et n'hésitez pas à me demander des infos supplémentaires si besoin ^^