use*_*938 5 c++ opengl depth-buffer
在GL维基上,他们建议使用GL_LEQUAL作为深度函数.此外,深度函数默认为GL_LESS.当我使用这些功能中的任何一个时,我得到了奇怪的结果.在这张图片中,红色方块应位于蓝色方块的前面(两个方块的大小相同):

但是,如果我使用glClearDepth(0.0)然后glDepthFunc(GL_GREATER)运行其他未更改的程序,我会得到:

稍微考虑一下,GL_LESS会给出它所做的结果是有意义的:如果传入的深度值小于存储的深度值,则写入片段.
如果我将相机放在(1, 0, 0)并朝向(0, 0, 0)我的方向望去,我希望物体在物体(0.5, 0, 0)前面(0, 0, 0).使用GL_LESS,对象(0, 0, 0)不会是其片段被写入的对象吗?
编辑:尼科尔,谢谢你提到投影矩阵.好像它设置不正确.我正在关注arcsynthesis.org上的教程一段时间并将代码调整到我自己的项目中,但是我偏离了你的投影矩阵并使用了glFrustum手册页中描述的数学来实现我自己的函数版本,然后使用了NeHe的gluPerspective更换以取代gluPerspective.我不知道为什么替换不起作用,因为我的矩阵数学是正确的(我已经对各种在线计算器进行了检查).使用矩阵我用GL_LESS得到正确的结果.
Sig*_*erm 18
为什么GL_LEQUAL建议用于GL深度函数
着色器.多通道alphablended闪电(可能与凹凸贴图).要做到这一点,你必须在相同的位置/深度上多次绘制相同的对象,但是使用不同的着色器/混合参数并且应该启用深度测试(深度写入可以在第一次过后禁用).GL_LESS将在此之后减少第二次传球和每次传球.GL_LEQUAL不会,并且照明将正常工作.
GL_LEQUAL本身不会导致z-fighting,当你有两个几乎平行的多边形共享几乎相同的位置时,就会发生z-fighting .通过增加深度缓冲精度可以减少效果.在过去,它也可以通过使用w-buffer(至少在DirectX中)来减少,但AFAIK这个功能不再流行了.
在这张图片中,红色方块应位于蓝色方块的前面(两个方块的大小相同):
没有源代码就无法正确回答.