OpenGL深度测试不起作用

时间:2017-01-30 12:17:46

标签: c++ opengl glut

我正在尝试使用OpenGL创建模型,并尝试启用深度测试。

我在@Override public Fragment getItem(int position) { switch (position) { case 0: return new HomeFragment(); case 1: return new CategoryFragment(); case 2: Intent intent = new Intent(context, AddProdActivity.class); startActivity(intent); return new AddProdFragment(); case 3: return new MyProdFragment(); case 4: return new MyProfileFragment(); default: return null; } }

中使用这些命令
main

这在我的展示中:

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);

我甚至尝试添加:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

它不起作用。我仍然可以看到我认为深度问题。 以下是显示问题的视频:https://www.youtube.com/watch?v=OafrRH4Mzjc

  • 注意:在该视频中,电路板从右到左,从上到下构建,因此第一个角度正常,但任何其他角度都不好。

我错过了什么?

编辑:复制的最小示例文件:

glDepthFunc(GL_LEQUAL);

2 个答案:

答案 0 :(得分:3)

gluPerspective(50, width / height, 0, 20);
                                   ^ wat

zNear需要greater than zero(强调我的):

  

深度缓冲区精度受zNear指定值的影响   和zFarzFarzNear的比率越大,越少   有效的深度缓冲区将区分表面   彼此靠近。

     

如果r = zFar / zNear需要log2(r)位深度缓冲区   精度丢失了。由于z r接近无穷大,因为zNear接近0, zNear绝不能设置为0。

编辑:鉴于新发布的MCVE:

int main(int argc, char **argv) {
    /* Creation of the window */
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(900, 600);
    glEnable(GL_DEPTH_TEST);  // too soon

    glutCreateWindow("Chess");
    ...
}

就像datenwolf said一样:在您拥有当前的GL上下文之前,您需要glEnable() glutCreateWindow()创建上下文并使其成为当前状态。

不要在 gl*()之后调用任何glutCreateWindow()个函数。

答案 1 :(得分:0)

   public void onSurfaceChanged(int w, int h)
    {
        Matrix.frustumM(projectionMatrix,0,-(9f/18.5f),(9f/18.5f),-1f,1f,1.0f,1000f);
    }

我不得不将我的近剪裁形式从 0.01f 更改为 1.0f。