opengl - 为什么 openGL glDepthFunc() 不起作用?

标签 opengl buffer depth zbuffer

我在玩 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);

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

my result

最佳答案

这是完全有效的行为,因为您没有使用填充多边形。当您使用 glPolygonMode (...) 时,面部剔除的行为仍然符合您的预期。 ,但深度测试没有。

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

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

通过 1

  • 将多边形模式设置为 填写
  • 禁用彩色写入:glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  • 绘制图元

  • 第2关
  • 将多边形模式设置为 线路
  • 启用彩色写入:glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
  • 绘制图元

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

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

    关于opengl - 为什么 openGL glDepthFunc() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942407/

    相关文章:

    c - 为什么这条布雷森汉姆线没有出现在它应该出现的地方?

    c - 这个字符缓冲区代码有什么问题?

    linux - 在 Ubuntu Linux 上操作音频输入缓冲区

    c++ - <Mat> 的循环缓冲区比应有的少

    css - 创建无限深度的 CSS 下拉菜单

    无法使用 VertexArrayObject 在 OpenGL 4.3 中显示纹理

    java - opengl/JOGL - 绘制纹理的最佳方法

    c++ - OpenGL宝典第5版代码问题

    algorithm - 决策树中叶子的最短可能深度(比较排序算法)

    algorithm - 迭代最近点库