java - 四边形出现在其他人面前,而他们不在

标签 java opengl lwjgl

我正在尝试编写一个简单的 Doom 风格的游戏,为此我决定编写一个 block 类型的引擎(与 Minecraft 非常相似),但是我遇到了一个问题: block 渲染非常奇怪,部分方 block 像什么都没有一样穿过。

这是当您从左侧看四边形时会发生的情况: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);

我使用显示列表渲染 block 的面。我尝试使用 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

那么,是什么导致了这个错误?有人遇到过类似的问题吗?

最佳答案

我没有看到您正在启用深度测试,

glEnable(GL_DEPTH_TEST);

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

尝试在渲染场景之前执行此操作,因为看起来对象被错误地覆盖了。另外,我认为你不应该将投影矩阵中的 near 值设置为零,因为这可能会给你带来一些麻烦。

关于java - 四边形出现在其他人面前,而他们不在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22304836/

相关文章:

java - Mac OSX El Capitan 上的 OpenGL 3.3 和 LWJGL

java - 扫描仪 next() 为某些在线编译器抛出 NoSuchElementException

java - Spring Boot JPARepository 在 save() 上的性能

opengl - 管理外部资源(类似于C++中的RAII?)

java - 使用 LWJGL 的 Keyboard 类将 int 转换为 char?

opengl - glDrawArrays 如何知道要绘制什么?

Java LWJGL OpenGL将3d点转换为2d点

java - -XstartOnFirstThread VM 参数的作用/含义是什么?

java - java中如何计算调用接口(interface)方法的count参数?

java.security.cert.CertificateException : No subject alternative names present;