2013-02-19 1 views
1

J'ai créé un cube et j'ai ensuite modifié ses coordonnées pour en faire un faisceau de ce type (click me).Le mappage de texture sur un cube apparaît incorrect

Je suis sûr que la texture est bien chargée car j'ai réussi à charger d'autres textures dans le projet (en utilisant SOIL).

Le code du faisceau est ceci:

glBindTexture(GL_TEXTURE_2D, obstacle_texture); 
glBegin(GL_QUAD_STRIP); 
    // front 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(side, 0.0f, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(side, height, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, height, 0.0f); 
    // back 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, -side); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(side, 0.0f, -side); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(side, height, -side); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, height, -side); 
    // right 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(side, 0.0f, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(side, 0.0f, -side); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(side, height, -side); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(side, height, 0.0f); 
    // left 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -side); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, height, -side); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, height, 0.0f); 
    // top 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, height, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(side, height, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(side, height, -side); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, height, -side); 
    // bottom 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(side, 0.0f, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(side, 0.0f, -side); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, -side); 
glEnd(); 

Le résultat est le suivant:

beam_wrongTextureMapping

Il devrait y avoir quelque chose de mal avec le mappage de texture OU
je aurais dû partir le cube tel qu'il est et appliqué la texture, puis l'échelle (mais je pense que cela rendrait la texture déformée).

Que dois-je faire?

Mise à jour # 1: Avant SOIL j'avais utilisé un chargeur pour les fichiers BMP que j'ai trouvés sur un site. Je l'ai utilisé maintenant, et il ressemble à ceci:

enter image description here

Notez qu'il semble que si le cube a des totalités triangulaires où je l'ai montrai. J'utilise SOL comme ceci:

GLuint tex_2d = SOIL_load_OGL_texture 
     (
     imagepath, 
     SOIL_LOAD_AUTO, 
     SOIL_CREATE_NEW_ID, 
     SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT 
     ); 
    glBindTexture(GL_TEXTURE_2D, tex_2d); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
+0

Pouvez-vous essayer de texturer un quad trivial? –

+0

@BartekBanachewicz: Comment est-ce que je peux placer ceci dans le chargeur SOIL? – Chris

+0

lisez la page d'exemple SOIL. J'ai réfléchi un peu plus et je pense que l'image est correctement chargée. Vérifiez cela pour être sûr. Si c'est chargé correctement - les texcoords sont mauvais. Si ce n'est pas - bien, corrigez ça en premier. Passez 'SOIL_LOAD_AUTO' au chargeur. –

Répondre

4

Ainsi, au moins trois problèmes ici.

Vous réalisez une quadruple bande, mais en donnant des coordonnées comme si vous produisiez des quads séparés. Vous obtiendrez ainsi des primitives supplémentaires. Ce n'est pas la source de vos problèmes, mais vous crachez une mauvaise géométrie quelque part.

Certaines des coordonnées UV semblent désactivées - sur certaines faces, les coords se déplacent autour du visage, tandis que dans d'autres, les coords zigzagent.

Voici vos deux premières faces:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(side, 0.0f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(side, height, 0.0f); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, height, 0.0f); 

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, -side); 
glTexCoord2f(0.0f, 1.0f); glVertex3f(side, 0.0f, -side); 
glTexCoord2f(1.0f, 0.0f); glVertex3f(side, height, -side); 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, height, -side); 

Dans la deuxième face, les deux coordonnées UV du milieu sont opposés en diagonale, mais pas le premier. Un seul d'entre eux peut être correct, donc sur le visage qui n'est pas correct, vous obtiendrez une mauvaise texturation. Votre problème de chargement de texture est susceptible d'être un problème de remplissage, la texture étant chargée avec une exigence de remplissage différente de ce que GL attend (GL, par défaut, s'attend à ce que les lignes de données de texture soient complétées à 4 octets). Dites à GL comment votre texture est rembourrée, ou changez la texture pour qu'elle corresponde (c'est pourquoi votre texture BMP fonctionne mieux - les exigences de remplissage pour BMP fonctionnent par hasard avec GL).

solutions possibles pour cela sont:

  • Dites-GL comment votre texture est emballé, en utilisant (par exemple) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • Modifier les dimensions de votre texture, de sorte que les matches de remplissage sans changer quoi que ce soit
  • Changez le chargement de votre texture, de sorte que le remplissage soit conforme à ce que GL attend.

Je suppose qu'il pourrait y avoir quelque chose de plus ici, comme vous avez une étrange bande jaune apparaissant sur à la fois les textures BMP et PNG, mais je réglerais les problèmes évidents d'abord. Enfin, conseil standard - évitez l'ancien pipeline à fonction fixe avec dépôt de sommets individuels, et utilisez les VBO et les appels draw.

+0

A propos des VBO: Ceci est pour une affectation et nous avons appris la méthode glVertex à dessiner. Depuis, c'est plus récent et fournit de meilleures performances que je vais l'utiliser la prochaine fois que j'écrirai quelque chose dans OpenGL. 1. Changé le quad_strip en quad et il semble sans tous ces trous (je l'avais changé en strip pour voir si le cube était bien dessiné et ensuite j'ai oublié de le restaurer) 2. J'ai corrigé les coordonnées , et le premier que vous avez posté est correct le bon. Suite .. – Chris

+0

3. J'ai également changé les dimensions de la texture pour être carré puisque j'ai remarqué que mes autres textures étaient aussi de dimensions carrées. Merci pour votre réponse. – Chris