OpenGL天空盒没有正确渲染侧面

OpenGL Skybox Not Rendering Sides Correctly

本文关键字:侧面 天空 OpenGL      更新时间:2023-10-16

我是OpenGL的新手,在尝试渲染天空盒时遇到了一个问题。这张图很好地说明了这个问题。

天空盒的侧面不显示,当我查看边缘(如在图片中),看起来图像是紧挨着渲染的,而不是立方体的不同面

void display ( void )   // Create The Display Function
{
glPushMatrix();
glDepthMask(0);
/* replace this code with your height field implementation */
/* you may also want to precede it with your rotation/translation/scaling */
/* Clear buffers */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt( 0.0, 0.0, 0.0,  // eye position
           0.1, 0.0, 0.1,  // camera direction
           0.0, 1.0, 0.0); // up direction
glPushAttrib(GL_ENABLE_BIT);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
glColor4f(1.0, 1.0, 1.0, 1.0);
/*!!!!!!!!!!!!!! FRONT FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D,frontTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(  0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 0); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 1); glVertex3f( -0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f(  0.5f, -0.5f, -0.5f );
glEnd();
/*!!!!!!!!!!!!!! LEFT FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, leftTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
glEnd();
/*!!!!!!!!!!!!!! RIGHT FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, rightTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(1, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f, -0.5f );
glEnd();
/*!!!!!!!!!!!!!! BACK FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, backTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
glEnd();
/*!!!!!!!!!!!!!! TOP FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, upTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
    glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
glEnd();
/*!!!!!!!!!!!!!! BOTTOM FACE !!!!!!!!!!!!!!!*/
glBindTexture(GL_TEXTURE_2D, downTextureId); // select which texture to use
glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
    glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
    glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
    glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
glEnd();
/*!!!!!!!!!!!!!! end of drawing of a textured quad !!!!!!!!!!!!!!!*/
glPopAttrib();
glPopMatrix();
/* Swap buffers, so one we just drew is displayed */
glutSwapBuffers();
}

我觉得我在这里缺少一些基本的东西,但我不确定是什么。代码是或多或少地逐字取自教程网站(http://sidvind.com/wiki/Skybox_tutorial)。代码是在Ubuntu Linux上用g++ 4.5.2编译的,但是在Visual studio也是。

我还应该说明,上面代码中使用的数字是下面的值生成链接图片

纹理需要在立方体边缘形成无缝连接。在你提供的截图中,这些图像并没有形成一个无缝连接(看看天空)。

也检查你的投影矩阵-你是否设置了一个透视变换?

设置透视投影(3D应用中最常见):

glMatrixMode(GL_PROJECTION);  // switch to projection matrix
glLoadIdentity();  // reset projection
gluPerspective(90.0,4.0/3.0,0.01,10.0);   // 90deg FOV, 4:3 aspect ratio, 0.01 near clip plane, 10.0 far clip plane
glMatrixMode(GL_MODELVIEW);  // back to model matrix

在我看来,右边的纹理应该在左边图像的左边。所以我猜你的立方体的纹理是错误的。