OpenGL纹理问题

时间:2011-12-11 15:01:49

标签: opengl texturing

我在opengl中有一些奇怪的问题:

enter image description here

这个场景由一个由4个纹理二次曲面(地板和3个墙壁)组成的开放式盒子和一些由gluSpheres制成的粗蘑菇组成,这些蘑菇分别经过翻译,缩放和纹理化。

如果你专注于地板,你会发现二次曲线的一半已经让它的纹理大幅扭曲,我已经三次检查地板的纹理坐标,似乎什么也没有他们错了(你可以看到,其他三面墙很好,他们遵循与地板相同的模式)。这种情况发生在我使用的任何纹理上(我只是使用RAW RGB数据)。

我将蘑菇带出现场,翘曲消失了,它真的很棒。谁看过这个吗?我对opengl比较陌生,所以当我看到这个时,我不知道该找什么。提前谢谢。

编辑:

包装盒代码:

    void drawRoom(void) {
        glPushMatrix();
            glScalef(10,10,10);
            GLuint texture = LoadTextureRAW("cave_two.raw",1);
            glEnable(GL_TEXTURE_2D);
            glBegin(GL_QUADS);

            //Floor
            glVertex3f(-1,-1,-1); glTexCoord2f(0,0); glNormal3f(0,1,0);
            glVertex3f(1,-1,-1); glTexCoord2f(1,0); glNormal3f(0,1,0);
            glVertex3f(1,-1,1); glTexCoord2f(1.0,1.0); glNormal3f(0,1,0);
            glVertex3f(-1,-1,1); glTexCoord2f(0.0,1.0); glNormal3f(0,1,0);


            //Back wall
            glVertex3f(-1,-1,-1); glTexCoord2f(0,0); glNormal3f(0,0,1);
            glVertex3f(1,-1,-1); glTexCoord2f(1,0); glNormal3f(0,0,1);
            glVertex3f(1,1,-1); glTexCoord2f(1.0,1.0); glNormal3f(0,0,1);
            glVertex3f(-1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(0,0,1);

            //Right wall
            glVertex3f(1,1,1); glTexCoord2f(0,0); glNormal3f(-1,0,0);
            glVertex3f(1,-1,1); glTexCoord2f(1,0); glNormal3f(-1,0,0);
            glVertex3f(1,-1,-1); glTexCoord2f(1.0,1.0); glNormal3f(-1,0,0);
            glVertex3f(1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(-1,0,0);

            //Left wall
            glVertex3f(-1,1,1); glTexCoord2f(0,0); glNormal3f(1,0,0);
            glVertex3f(-1,-1,1); glTexCoord2f(1,0); glNormal3f(1,0,0);
            glVertex3f(-1,-1,-1); glTexCoord2f(1.0,1.0); glNormal3f(1,0,0);
            glVertex3f(-1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(1,0,0);

            glEnd();
            glDisable(GL_TEXTURE_2D);
            glDeleteTextures( 1, &texture );
        glPopMatrix();
        }

1 个答案:

答案 0 :(得分:1)

如果没有看到代码,我们所能做的就是疯狂的猜测。这是我的。

我怀疑你先指定一个顶点(glVertex*),然后再指定该顶点的纹理坐标(glTexCoord*)。这是错误的方式:texcoords成为状态的一部分,并应用于所有随后绘制的顶点。使用这样的纹理,你不会注意到它实际旋转了90度。

此外,我怀疑你先画了蘑菇,然后是盒子。然后,盒子的第一个顶点接收最后一个蘑菇在其最后一个顶点上使用的texcoord,这恰好是错误的。没有shroom,它从最后一个盒子面上得到最后一个texcoord,这恰好是正确的。

您可能还想指定GL_LINEAR_MIPMAP_LINEAR而不是GL_LINEAR_MIPMAP_NEAREST来使mipmapping工件消失,因为现在使用0和1级mipmap之间存在明显的边缘。