【OpenGL】GL_DEPTH_TEST深度测试问题

记录一个深度测试的问题

在实现一个简单的OpenGL程序时,遇到了一个问题,深度测试总是有问题,无法正常显示,如下

    

正常情况为

  

通过调试发现屏幕空间中的所有深度值均为1。

OpenGL代码如下:

void initOpenGL()
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearDepth(1.0f);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.0, 100);
    mvp.setProjection(projectionMatrix);
    mvp.setViewTranslate(0.0f, 0.0f, -3.0f);
}

void renderScence()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    ... ...

    glutSwapBuffers();
}
 

  代码并无明显问题,通过查找相关资料,最后发现是投影矩阵的问题,问题的根源是perspective的第三个参数是透视投影的近平面,近平面的值要始终是正数

  将  vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.0, 100);

  改为 vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.1, 100);

程序运行正确。

深度图如下

相关内容可以查看透视投影的推导过程,

如下所示,透视投影假设人眼位置为0,近平面位置大于0,

  

  图出自OpenGL编程指南8

 
 
 
 
 
原文地址:https://www.cnblogs.com/esCharacter/p/9024580.html