2012-02-14 5 views
1

Je rencontre un problème avec le mappage de texture dans OpenGL. J'essaie d'appliquer différentes textures à différents objets de la scène, mais je trouve que l'application d'une deuxième texture à un second objet change les coordonnées de texture (je pense) sur la première. Les deux objets sont un cube et un cylindre.Problème de coordonnées de texture OpenGL

Avec une seule texture est activée, la scène ressemble à ceci: enter image description here

Si activer puis textures pour 1 ou plusieurs autres objets, je vois cela (je ne suis pas trop pris la peine de la mauvaise application de texture sur les «roues» en ce moment): enter image description here

Ce qui pourrait être à l'origine de cela? est en dessous de mon code de dessin pour le cube et cylindres:

Cube:

//Alias the values for easier reading 
double X = Position().X; 
double Y = Position().Y; 
double Z = Position().Z; 
double W = _fWidth; 
double H = _fHeight; 
double D = _fDepth; 

//Set textures if necessary 
if(super._blHasTexture) 
{ 
    super._obTexture.bind(gl); 
} 

_obTexture.enable(gl); 
gl.glColor3f(0.5f, 0.5f, 0.7f); 
//Draw 

    gl.glBegin(GL2.GL_QUADS); 
     //Front 
    gl.glNormal3f(0f, 0f, 1f); 
    gl.glVertex3d(X, Y, Z);  gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X+W, Y, Z); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X, Y-H, Z); gl.glTexCoord2f(0f, 1f); 

    //Back 
    gl.glNormal3f(0f, 0f, -1f); 
    gl.glVertex3d(X, Y, Z-D); gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(0f, 1f); 

    //Left 
    gl.glNormal3f(-1f, 0f, 0f); 
    gl.glVertex3d(X, Y, Z);  gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X, Y, Z-D); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X, Y-H, Z); gl.glTexCoord2f(0f, 1f);    

    //Right 
    gl.glNormal3f(1f, 0f, 0f); 
    gl.glVertex3d(X+W, Y, Z); gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(0f, 1f); 

    //Top 
    gl.glNormal3f(0f, 1f, 0f); 
    gl.glVertex3d(X, Y, Z);  gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X+W, Y, Z); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X+W, Y, Z-D); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X, Y, Z-D); gl.glTexCoord2f(0f, 1f); 

    //Bottom 
    gl.glNormal3f(0f, -1f, 0f); 
    gl.glVertex3d(X, Y-H, Z); gl.glTexCoord2f(0f, 0f); 
    gl.glVertex3d(X+W, Y-H, Z); gl.glTexCoord2f(1f, 0f); 
    gl.glVertex3d(X+W, Y-H, Z-D); gl.glTexCoord2f(1f, 1f); 
    gl.glVertex3d(X, Y-H, Z-D); gl.glTexCoord2f(0f, 1f); 
gl.glEnd(); 

_obTexture.disable(gl); 

Cylindre:

GLUquadric quad = glu.gluNewQuadric(); 
glu.gluQuadricTexture(quad, true); 

_obTexture.bind(gl); 
_obTexture.enable(gl); 

    //Draw the caps 
gl.glBegin(GL2.GL_TRIANGLE_FAN); 
    gl.glVertex3f(0f, 0f, 0.01f); 
    gl.glTexCoord2f(0f, 0f); 
    for(int t = 0; t < 20; t++) 
    { 
     float X = _fRadius * (float)Math.cos(t); 
     float Y = _fRadius * (float)Math.sin(t); 
     gl.glVertex3f(X, Y, 0.01f); 
    } 
    gl.glTexCoord2f(1f, 1f); 
gl.glEnd(); 

gl.glBegin(GL2.GL_TRIANGLE_FAN); 
    gl.glVertex3f(0f, 0f, -0.01f + _fHeight); 
    gl.glTexCoord2f(0f, 0f); 
    for(int t = 0; t < 20; t++) 
    { 
     float X = _fRadius * (float)Math.cos(t); 
     float Y = _fRadius * (float)Math.sin(t); 
     gl.glVertex3f(X, Y, -0.01f + _fHeight); 
    } 
     gl.glTexCoord2f(1f, 1f); 
gl.glEnd();   

glu.gluCylinder(quad, _fRadius, _fRadius, _fHeight, 20, 1); 
_obTexture.disable(gl); 

Répondre

4

cédez votre coordonnées de texture avant chaque appel à glVertex, et non après - appels après appliquent à l'appel glVertex suivant.

De la manière dont vous le faites, le dernier jeu de coordonnées est appliqué au premier sommet (c'est-à-dire un coin de votre cube) dans le cycle de rendu suivant, d'où la différence lorsque vous restituez des objets.

+0

Fantastique! Cela l'a réparé tout de suite, merci beaucoup. – AndyBursh