为什么openGL的glDepthFunc()函数无法正常工作?

4

我正在使用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参数,但仍然没有帮助。

那么,您有什么想法吗?非常感谢。

我的结果

1个回答

9
这是完全有效的行为,因为您没有使用填充多边形。当您使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接