2010-08-09 3 views
2

J'essaie d'utiliser une texture rectangulaire avec OpenGL. Lorsque la hauteur est égale à la largeur de la texture, tout semble correct, cependant, lorsque la hauteur est différente de la largeur, la texture semble déformée.texture rectangulaire dans OpenGL avec à la fois la largeur et la hauteur POT

Ma fonction d'affichage est (h et w sont GLOBALS la hauteur stockage et la largeur de l'image):

S'il vous plaît noter que la taille de l'image dessinée n'a pas d'importance. Il est déformé indépendamment de la taille réelle du polygone.

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
    glBindTexture(GL_TEXTURE_2D, texName); 
    glTranslatef(-2.0f,-2.0f,0.0f); 
    glScalef(1.0f/128.0f,1.0f/128.0f,1.0f); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0); 

    // Will be distorted also with the following: 
    /*glScalef(1.0f/128.0f,1.0f/128.0f,1.0f); 
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0);*/ 

    glEnd(); 
    glFlush(); 
    glDisable(GL_TEXTURE_2D); 
} 

Je chargement de la texture avec:

void *data = LoadBMP("c:\\dev\\64x128_face.bmp"); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glGenTextures(1, &texName); 
glBindTexture(GL_TEXTURE_2D, texName); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
       GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, 
      h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
      data); 

Quand je suis le chargement d'une image de texture carrée 64x64, il semble bien. Cependant, lorsque je charge une image de texture rectangulaire, l'image semble déformée.

Comment OpenGL prend-il en charge la texture POT rectangulaire? Qu'est ce qui ne va pas avec mon code?

Répondre

0

Votre image rect est 64x128 mais vous rendent avec ces commandes:

glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0); 

où h est la hauteur (= 128) et w (= 64) est de largeur. Mais vous avez placé la hauteur sur x (qui est la largeur) et la largeur sur y (qui est la hauteur). Peut-être essayer ceci:

glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); 
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0); 
+0

non, il est déformé jamais le moins. Ajout d'une clarification à la question. (Notez que vous devez redimensionner l'image un peu, sinon vous ne verrez qu'un seul gros texel). –

+0

Pourriez-vous poster/télécharger une image de la distorsion? Peut-être que ce serait plus facile, si je pouvais voir comment il est déformé. Ou décrire la distorsion verbalement, est-ce étiré, ou pressé? – Rock

+0

avez-vous essayé mon code et ça vous est arrivé? Ce que je vois est une bande horizontale de la partie la plus à gauche de l'image suivie par une autre bande horizontale de la partie la plus à droite de l'image. –

0

Vous devriez probablement vérifier le soutien de la GL_ARB_texture_non_power_of_two l'extension avant d'utiliser la non-puissance de-deux valeurs pour h et w dans glTexImage2D() , car la spécification de hauteurs et de largeurs arbitraires n'est valide qu'avec cette extension.

+0

non. C'est un rectangle POT, mais c'est un rectangle et non un carré. –

+0

que voulez-vous dire par «déformée»? est-ce qu'il est "incorrectement mis à l'échelle dans l'une des directions" ou "pixels d'ordures", ou "texture faussée"? Cela aidera beaucoup à comprendre le problème. – mbaitoff

Questions connexes