Qt中的OpenGL深度测试无法正常工作

时间:2012-02-17 21:10:15

标签: qt opengl depth-testing

我将格式设置为:

QGLFormat format = QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
setFormat(format);
构造函数中的

然后在 initializeGL 中设置depthTesting。

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);                                   // Enables Clearing Of The Depth Buffer
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LESS);                               // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH);                            // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
}

在paintGL中我清除深度缓冲区。

void VoxelEditor::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    draw();
}

我记得它曾经使用较少的顶点,所以可能是我使用了太多的深度缓冲区来处理(?)。 我有32 * 32 * 32体素,大部分时间都是一半,所以98304四边形。

深度测试仍然不起作用,并按执行顺序显示四边形。

2 个答案:

答案 0 :(得分:1)

  

因此我可能会使用太多的深度缓冲来处理(?)。

深度缓冲区忽略了顶点。所有它看到的都是传入的碎片,无论多少都无关紧要。

void VoxelEditor::initializeGL()
{
    glClearDepth(2000.0);   // Enables Clearing Of The Depth Buffer

此行无法清除。它设置深度缓冲区被清除的值。该值必须在0 ... 1范围内。清除深度在标准化设备坐标中,即在模型视图之后,已应用投影和均匀分割。默认值为1.

    glEnable(GL_DEPTH_TEST);  // Enables Depth Testing
    glDepthFunc(GL_LESS);     // The Type Of Depth Test To Do
    glShadeModel(GL_SMOOTH)  // Enables Smooth Color Shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations

不,那不是什么意思。透视只是一个线性变换,总是起作用。这意味着,纹理坐标可以以不同的方式进行插值以提高质量。

}

我总是建议将这些调用放在绘图函数中,因为它们不会初始化任何内容。他们设定了绘画状态。 OpenGL是一个状态机,一个重要的状态机规则是,要么你要跟踪它们的状态,你必须在它们使用它时将它们置于已知状态。

答案 1 :(得分:1)

我通过在draw()中设置setDepthTest来修复此问题。

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);