mat*_*los 4 opengl buffer zbuffer depth
即时通讯玩openGL,我试图摆脱蓝色标记的三角形.我用它来代码:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
Run Code Online (Sandbox Code Playgroud)
是的,我用
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
在我的主循环中.我看过问题可以是投影矩阵.我使用这些值:
ProjectionMatrix = glm::perspective(45.5f, 4.0f / 3.0f, 0.1f, 100.0f);
Run Code Online (Sandbox Code Playgroud)
我试图改变近端和远端值,但它仍然是相同的.我也尝试更改glDepthFunc的参数,但它也没有帮助我.那么,任何想法?非常感谢

这是完全有效的行为,因为您没有使用填充多边形.面部剔除仍然表现出您使用时的预期方式glPolygonMode (...),但深度测试却没有.
深度测试和写入仅适用于光栅化期间的片段,而不适用于剪切/基元组装期间的基元.简而言之,这意味着未填充的任何地方都不会受到基元深度(例如三角形)的影响.因此,深度测试在此示例中应用的唯一位置是屏幕上两条线重叠的极少数点.
如果要防止线框覆盖图为通常不可见的三角形绘制线条,则需要绘制两次:
glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)这将起作用,因为第一遍使用填充(实心)基元填充深度缓冲区,但不会写入颜色缓冲区(因此一切都仍然是透明的).第二个过程在每个基元的边缘绘制线条,如果另一个三角形的内部(未填充区域)覆盖它,这些线条将无法进行深度测试.
注意:您应该使用包含相等(例如GL_LEQAUL)的深度测试来正确运行上述行为.所以不要使用GL_LESS.