1

我想用 openGL 创建一个 3d 立方体。另外,我想用我在纹理中转换的图像覆盖每一面。

我在 2D 中找到立方体坐标,并QUADS为每一面创建一个。

我的问题是,当我渲染对应立方体侧面的纹理时,我看到这些纹理相互重叠,正如您在这张图片中看到的那样:

在此处输入图像描述

我的代码是:

初始化:

glGenTextures(2, textures);
glClearColor (0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0f);                         // Depth Buffer Setup
glEnable(GL_DEPTH_TEST);                        // Enables Depth Testing
glDepthFunc(GL_ALWAYS);

在 xture 中转换图像:

up = imread("up.png");

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, up.cols, up.rows, GL_RGB, GL_UNSIGNED_BYTE, up.data);

显示立方体:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Set Projection Matrix
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, WIDTH, HEIGHT, 0); 

    // Switch to Model View Matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 

glBindTexture(GL_TEXTURE_2D, textures[1]);
        glBegin(GL_QUADS);
        //sopra
        glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[6].x)),(GLfloat)(coord[6].y));
        glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[5].x)),(GLfloat)(coord[5].y));
        glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[4].x)),(GLfloat)(coord[4].y));
        glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[7].x)),(GLfloat)(coord[7].y)); 
        glEnd();

我对立方体的另一面做同样的事情。我渲染纹理的顺序是:

底(地)侧

上边

背后

前面

左边

右边

有什么问题或我错过了什么?或者,Maybe 无法创建具有 2d 坐标 ( glVertex2f (...)) 的 3d 立方体?

谢谢你的帮助!

4

1 回答 1

2

您无法创建具有 2d 坐标的立方体。边是重叠的,因为它们都在空间的同一平面上。立方体位于 3d 空间中,因此需要 3 个坐标,x、y 和 z。

所以尝试使用:

glVertex3f(x, y, z);

并根据您想要每个面的位置使用一些适当的 z 值。

对于纹理,您仍然可以使用:

glTexCoord2f(x, y);

因为纹理在二维空间中。

如果您仍然对坐标使用什么感到困惑,我建议您阅读本文以帮助您了解 openGL 中的 3d 空间:

http://www.falloutsoftware.com/tutorials/gl/gl0.htm

于 2013-02-18T23:36:19.990 回答