我在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();
}
答案 0 :(得分:1)
如果没有看到代码,我们所能做的就是疯狂的猜测。这是我的。
我怀疑你先指定一个顶点(glVertex*
),然后再指定该顶点的纹理坐标(glTexCoord*
)。这是错误的方式:texcoords成为状态的一部分,并应用于所有随后绘制的顶点。使用这样的纹理,你不会注意到它实际旋转了90度。
此外,我怀疑你先画了蘑菇,然后是盒子。然后,盒子的第一个顶点接收最后一个蘑菇在其最后一个顶点上使用的texcoord,这恰好是错误的。没有shroom,它从最后一个盒子面上得到最后一个texcoord,这恰好是正确的。
您可能还想指定GL_LINEAR_MIPMAP_LINEAR
而不是GL_LINEAR_MIPMAP_NEAREST
来使mipmapping工件消失,因为现在使用0和1级mipmap之间存在明显的边缘。