我在玩 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 的参数,但它也没有帮助我。
那么,任何想法?非常感谢
最佳答案
这是完全有效的行为,因为您没有使用填充多边形。当您使用 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/