2013-02-18 34 views
1

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

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

我的问题是,当我渲染与立方体边的纹理,我看到这些纹理相互重叠,你可以在此图像中看到:

enter image description here

我的代码是:

初始化:

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); 

变换的thexture图像:

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(); 

我为立方体的另一侧相同。 的顺序,其中我渲染纹理是:

底部(地面)侧

向上侧

背后侧

前侧

左侧

右侧

什么是错的或我错过了什么?或者,也许不能用2d坐标创建一个3d立方体(glVertex2f (...))?

感谢您的帮助!

+0

看起来像Z缓冲问题。 – 2013-02-18 23:31:35

+0

你能告诉我更多吗? OpenGL对我来说是新的... – Cristina1986 2013-02-18 23:34:31

+1

为什么不使用普通的3D对象而不是用2D来伪造它?它会扰乱你的深度缓冲区并扭曲你的纹理。 – Matzi 2013-02-18 23:36:28

回答

2

您不能使用2d坐标创建立方体。双方重叠,因为它们都在同一架飞机上。立方体在3d空间中,因此需要3个坐标,x,y和z。

所以请尝试使用:

glVertex3f(x, y, z); 

,并根据您希望每个面用一些适当的z值。

的纹理,你仍然可以使用:

glTexCoord2f(x, y); 

由于纹理在2维空间。

如果你还在困惑如何使用您的坐标,我建议你阅读这可以帮助您了解3D空间在OpenGL:

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

+0

谢谢!我接受你的答案。 – Cristina1986 2013-02-18 23:44:36