3

我将格式设置为:

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 个四边形。

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

4

2 回答 2

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 是一个状态机,状态机的一个重要规则是,您要么跟踪它们的状态,要么你要使用它时将它们置于一个已知状态。

于 2012-02-17T21:52:41.140 回答
0

我通过在 draw() 中设置 setDepthTest 来解决这个问题。

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
于 2012-02-17T23:14:53.623 回答