四边形出现在别人面前,而不是

时间:2014-03-10 15:47:53

标签: java opengl lwjgl

我正在尝试编写一个简单的Doom风格游戏,为此我决定编写一个块型引擎(与Minecraft很相似),但是我遇到了一个问题:块渲染真的很奇怪,部分街区通过什么都没有。

当你从左边看四边形时会发生这种情况:left 但是,当你从右边看时,一切看起来都很好:right

让我们来看看代码,好吗? 这就是我初始化OpenGL的方式:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), 0, -2);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

我使用显示列表渲染块的面。我尝试使用VBO,但改为显示列表,因为我认为它们导致了问题。每个显示列表看起来大致相同:

        glNewList(listTop, GL_COMPILE);
        glBegin(GL_QUADS);
        tex.bind();
            glTexCoord2f(0, 0);
        glVertex3f(x+0.0f, y+1.0f, z-1.0f); 
            glTexCoord2f(0, 1);
        glVertex3f(x+0.0f, y+1.0f, z+0.0f); 
            glTexCoord2f(1, 1);
        glVertex3f(x+1.0f, y+1.0f, z+0.0f); 
            glTexCoord2f(1, 0);
        glVertex3f(x+1.0f, y+1.0f, z-1.0f); 
        glEnd();
    glEndList();

然后是渲染:

glClearColor(0, .5f, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);

            glPushMatrix();

          if(rTo)glCallList(listTop);
          if(rBt)glCallList(listBot);
          if(rFr)glCallList(listFront);
          if(rBk)glCallList(listBack);
          if(rLe)glCallList(listLeft);
          if(rRi)glCallList(listRight);

            glPopMatrix();

    glLoadIdentity();
    //Display.update() etc here

那么,可能导致这个错误的原因是什么?有人有类似的问题吗?

2 个答案:

答案 0 :(得分:5)

我没有看到你正在启用DEPTH TEST,

glEnable(GL_DEPTH_TEST);

此外,您必须清除每一帧的深度缓冲区。

尝试在渲染场景之前执行此操作,因为它看起来对象被错误地重叠。另外,我认为您不应该将投影矩阵中的近似值设置为零,因为它可能会在以后引起您的麻烦。

答案 1 :(得分:1)

好的,事实证明我没有启用GL_DEPTH_TEST。虽然这是问题所在,但并不是唯一的问题。最大的问题是 gluPerspective 方法,zNear设置为0,我知道它需要大于0.所以,改变这一行:

gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), 0, -2);

对此:

gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), 0.1f, -2);

AND启用GL_DEPTH_TEST修复了所有内容:)