1

我对opengl中的一些纹理有一个奇怪的问题:

在此处输入图像描述

该场景由一个开放的盒子组成,该盒子由 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();
        }
4

1 回答 1

1

没有看到代码,我们所能做的就是胡乱猜测。这是我的。

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

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

您可能还想指定GL_LINEAR_MIPMAP_LINEAR而不是GL_LINEAR_MIPMAP_NEAREST让 mipmap 工件消失,因为现在在第 0 级和第 1 级 mipmap 的使用位置之间存在明显的界限。

于 2011-12-11T15:14:08.317 回答