【问题标题】:OpenGL Skybox Not Rendering Sides CorrectlyOpenGL Skybox 未正确渲染边
【发布时间】:2011-09-11 23:43:29
【问题描述】:

我是 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 编译的,但是在下面出现同样的问题 视觉工作室也是如此。

我还应该声明,上面代码中使用的数字是 制作了链接的图片。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

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

    还要检查您的投影矩阵 - 您是否设置了透视变换?

    要设置透视投影(最常见的 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
    

    【讨论】:

    • 据我所知,我给出的坐标应该形成无缝边缘。当相机沿轴(在任一方向)指向时,框的适当一侧会出现,但它被黑色包围,而不是框的另一侧。它仅使用 gluLookAt 函数更改视角,但即使没有该调用,问题仍然存在。我注意到,当我尝试沿 z 轴平移时,图像的大小没有变化。
    • 您可以编辑您的问题以在您设置投影矩阵的位置添加代码吗? (glMatrixMode(GL_PROJECTION);之后的东西)
    • 我没有调用 glMatrixMode(也许这是我的问题)。
    • 您应该在程序中的某个地方设置投影矩阵 - 我将通过一个简单的示例来编辑我的答案。
    • 透视投影正是我的问题。谢谢!
    【解决方案2】:

    在我看来,右侧的纹理应该在左侧图像的左侧。所以我猜你正在为立方体的错误侧面设置纹理。

    【讨论】:

    • 可能,但我认为这不是导致我的主要问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多