java - OpenGL Z 顺序困惑

标签 java opengl lwjgl zbuffer

我无法弄清楚为什么我的一些对象被渲染在彼此之上。我已开启深度测试。

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

我需要按照距离相机最近的顺序进行绘制吗? (我以为 OpenGL 已经为你做到了这一点。)

as you can see the cubes on the left are drawn correctly but the ones on the right are not

设置代码:

 private  void setUpStates() {
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);        
    glLightModel(GL_LIGHT_MODEL_AMBIENT, BufferTools.asFlippedFloatBuffer(new float[]{0, 0f, 0f, 1f}));         
    glLight(GL_LIGHT0, GL_CONSTANT_ATTENUATION,BufferTools.asFlippedFloatBuffer(new float[]{1, 1, 1, 1}) );

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_DIFFUSE);   
    glMaterialf(GL_FRONT, GL_SHININESS, 50f);           
    camera.applyOptimalStates();       

    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_TEXTURE_2D);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);



    glEnableClientState(GL_VERTEX_ARRAY);       
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

渲染代码:

private void render() {

    // Clear the pixels on the screen and clear the contents of the depth buffer (3D contents of the scene)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Reset any translations the camera made last frame update
    glLoadIdentity();
    // Apply the camera position and orientation to the scene
    camera.applyTranslations();
    glLight(GL_LIGHT0, GL_POSITION, BufferTools.asFlippedFloatBuffer(500f, 100f, 500f, 1));        
    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);       

    for(ChunkBatch cb : InterthreadHolder.getInstance().getBatches()){
        cb.draw(camera.x(), camera.y(), camera.z());
    }


}

ChunkBatch中的draw方法:

    public void draw(float x, float y, float z) {
    shader.bind();
    shader.setUniform("cameraPosition", x,y,z);      
   for(ChunkVBO c : VBOs){  
        glBindBuffer(GL_ARRAY_BUFFER, c.vertexid);
        glVertexPointer(3, GL_FLOAT, 0, 0L);
        glBindBuffer(GL_ARRAY_BUFFER, c.colorid);
        glColorPointer(3, GL_FLOAT, 0, 0L);
        glBindBuffer(GL_ARRAY_BUFFER, c.normalid);
        glNormalPointer(GL_FLOAT, 0, 0L);
        glDrawArrays(GL_QUADS, 0, c.visibleFaces * 6);          
    }
    ShaderProgram.unbind();     
}

最佳答案

我在创建窗口时忘记请求深度缓冲区:

之前:

Display.create(new PixelFormat(4,0,0,4));

之后

Display.create(new PixelFormat(4,24,0,4));

关于java - OpenGL Z 顺序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462350/

相关文章:

java - 删除 ListView 项之间的间距

c++ - OpenGL 四元数类的使用

java - 如何计算世界空间中的相机向上 vector

java - 我是否需要将我的 Java 应用程序转换为小程序才能将其发布到网页上?

c++ - 绘制动态几何的正确或最佳方法是什么

java - OpenGL 非常大的网格裁剪

Java- 键绑定(bind)不工作/actionPerformed 未被调用

java - 多个字段 : volatile or AtomicReference?

java - Android 旋转器错误 : getOnItemSelectedListener in AdapterView cannot be applied

java.lang.NoSuchMethodError : getPointer