【问题标题】:Why is openGL glDepthFunc() not working?为什么 openGL glDepthFunc() 不起作用?
【发布时间】:2013-11-25 09:11:24
【问题描述】:

我正在玩 openGL,我试图摆脱蓝色标记的三角形。我用这个代码:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);

是的,我使用

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

在我的主循环中。我读过问题可能是投影矩阵。我使用这些值:

ProjectionMatrix = glm::perspective(45.5f, 4.0f / 3.0f, 0.1f, 100.0f);

我试图改变近和远的价值,但它仍然是一样的。我也在尝试更改 glDepthFunc 的参数,但它也没有帮助我。 那么,有什么想法吗??非常感谢

【问题讨论】:

    标签: opengl buffer depth zbuffer


    【解决方案1】:

    这是完全有效的行为,因为您没有使用填充多边形。当您使用glPolygonMode (...) 时,人脸剔除仍然会按照您预期的方式运行,但深度测试不会。

    深度测试和写入仅适用于光栅化期间的片段,而不适用于裁剪/图元组装期间的图元。简而言之,这意味着任何未填充的地方都不会受到图元深度的影响(例如三角形)。因此,此示例中唯一应用深度测试的地方是屏幕上两行重叠的极少数点。

    如果您想防止线框覆盖为通常不可见的三角形绘制线条,则需要绘制两次:

    通过 1

    1. 将多边形模式设置为 FILL
    2. 禁用颜色写入:glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
    3. 绘制基元

    通过 2

    1. 将多边形模式设置为 LINE
    2. 启用颜色写入:glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
    3. 绘制基元

    这将起作用,因为第一遍使用填充(实心)图元填充深度缓冲区,但不写入颜色缓冲区(因此一切仍然是透明的)。第二遍在每个图元的边缘绘制线条,如果另一个三角形的内部(未填充区域)覆盖这些线条,这些线条将无法通过深度测试。

    注意:您应该使用包含相等性的深度测试(例如GL_LEQAUL),以使上述行为正常运行。所以不要使用GL_LESS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多