【问题标题】:OpenGL Depth Testing in Qt not workingQt中的OpenGL深度测试不起作用
【发布时间】:2012-03-09 06:38:46
【问题描述】:

我设置格式:

QGLFormat format = QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer);
setFormat(format);

构造函数中

然后在 initializeGL 我设置 depthTesting on。

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

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

【问题讨论】:

  • 不可能是 glClearDepth() 和 glDepthFunc 的组合负责。如果您尝试删除 glClearDepth() 怎么办?
  • 我尝试将 glDepthRange 从 0 添加到 1,但这也不会改变任何东西:S

标签: qt opengl depth-testing


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

【讨论】:

  • 我从一个(显然很糟糕的)教程中复制了几行。我还没有研究 glHint 选项和 glClearDepth ,尽管后者已经被删除,因为它的默认值是正确的。知道缺陷是什么吗?这不是一个真正的答案..
  • @KajToet:没有看到你的整个代码,我什至无法猜测。抱歉,那个水晶球似乎完全是盗版;)
【解决方案2】:

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

glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);

【讨论】:

  • 这正是我建议你做的。请参阅我回答的最后一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多