Java OpenGL:zbuffer中的对象顺序(LWJGL 3和GLFW 3)

Java OpenGL:zbuffer中的对象顺序(LWJGL 3和GLFW 3),java,opengl,lwjgl,Java,Opengl,Lwjgl,我回到了传统的深度测试问题;我尝试了很多东西,谷歌搜索到了不可搜索的,但仍然没有找到解决办法 我使用Java和LWJGL 3和GLFW渲染一些对象,立方体渲染时启用z缓冲区,我认为: // renderer setup @Override public void setup() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClea

我回到了传统的深度测试问题;我尝试了很多东西,谷歌搜索到了不可搜索的,但仍然没有找到解决办法

我使用Java和LWJGL 3和GLFW渲染一些对象,立方体渲染时启用z缓冲区,我认为:

// renderer setup
@Override
public void setup() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearDepth(1.0f);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_TEXTURE_2D);
    // cull face? Maybe? .... dunno
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    // here, hey, OpenGL, do you see this thing!?
    glEnable(GL_DEPTH_TEST);
    glDepthMask(true);
    glDepthFunc(GL_LEQUAL);
    glFrontFace(GL_CW);
    glDisable(GL_DITHER);
}
但如果我使用VBOs渲染立方体,它们会相互过度渲染

// window creation
    if(glfwInit() != GL_TRUE) {
        throw new DeRiveanException("Cannot init GLWF subsystem.");
    }
    glfwDefaultWindowHints();
    glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    long monitorHandle = glfwGetPrimaryMonitor();
    ByteBuffer videModeBuffer = glfwGetVideoMode(monitorHandle);
    setWidth(GLFWvidmode.width(videModeBuffer) * 3 / 4);
    setHeight(GLFWvidmode.height(videModeBuffer) * 3 / 4);
    if((windowHandle = glfwCreateWindow(getWidth(), getHeight(), "title goes here", 0, 0)) == 0) {
        throw new DeRiveanException("Cannot create window handle. Da fucQ!?");
    }
    glfwSetInputMode(windowHandle, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    glfwSetWindowPos(windowHandle, (GLFWvidmode.width(videModeBuffer) - getWidth()) / 2, (GLFWvidmode.height(videModeBuffer) - getHeight()) / 2);
    glfwMakeContextCurrent(windowHandle);
    glfwSwapInterval(GL_FALSE);
    glfwSetInputMode(windowHandle, GLFW_STICKY_KEYS, GL_TRUE);
    glfwSetCursorPos(windowHandle, getWidth() / 2, getHeight() / 2);
    GLContext.createFromCurrent();
编辑 好的,现在我知道了,我有深度24位缓冲区,所以bug在另一个地方:

部分明白了
…我已经将引擎尽可能地缩小,并发现,在连接摄像头之前,一切都正常。这很奇怪,但如果我能走路环顾四周,z缓冲区就会消失;如果我设置了静态视图,z-buffer将愉快地生存到它的结束

检查视频模式是否包含深度缓冲区。glfwWindowHintGLFW_深度_位,32;这是默认选项,我尝试了glfwWindowHintGLFW_深度_位,24;和glfwWindowHintGLFW_深度_位,32;都在glfwCreateWindow之前,并且都具有与图像中相同的结果。。。。是否有选项检查我是否有可用的深度缓冲区?如果您使用的是OpenGL 3.0或更早版本,或兼容配置文件,则可以在创建上下文后从OpenGL查询GL_深度_位的值。在较新的版本中被删除。另外,32位深度缓冲区最好留给FBO,一些平台在默认帧缓冲区上不支持它们。