我在使用opengl绘制简单的2d纹理四边形时遇到了一些与z战斗的问题。症状是物体以相同的速度移动而一个物体在另一个物体的顶部移动,但是周期性地可以看到另一个物体,反之亦然 - 有点像“闪烁”。我认为这确实是z战斗。
我已关闭深度测试,并且还有以下内容:
gl.Disable(gl.DEPTH_TEST)
gl.DepthFunc(gl.LESS)
gl.Enable(gl.BLEND)
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
我的观点和正交矩阵如下:
我试图将近距离和远距离设置得更远(比如50000的范围,但仍然没有帮助)
Projection := mathgl.Ortho(0.0, float32(width), float32(height), 0.0, -5.0, 5.0)
View := mathgl.LookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
与我的opengl进程的唯一区别在于,不是为每个单独的对象调用drawelements,而是将所有顶点,uvs(sprite atlas),平移,旋转等打包到一个发送到顶点着色器的大包中。
有没有人对2d z战斗有补救措施?
编辑:
我正在添加一些图片以进一步描述该场景:
这些图像彼此间隔几秒钟拍摄。它们只是纹理从左向右移动。随着他们的移动;从图像中可以看出,一个精灵过快地反复出现,反之亦然,来回等等。
另请注意,我的图像(精灵)是具有透明背景的png ..
答案 0 :(得分:2)
如果您已禁用深度测试,则绝对不是深度战斗,如代码段所示。
“我将所有顶点,uvs(精灵地图集),翻译,旋转等包装在一个发送到顶点着色器的大包中。” - 您需要查看添加精灵的顺序。也许由于某种原因它不一致。
答案 1 :(得分:1)
这可能是Z战斗
通常的原因是:
解决此问题的一些方法:
glDepthFunc(GL_LEQUAL)
这可能是混合的问题。
当您使用混合时,您需要以不同的方式渲染。要正确渲染透明度,必须对场景进行Z排序,否则可能会发生伪影。如果透明物体或其附近的物体有太多密集的几何体(附近有许多多边形边缘)。此外,Z-fighting在混合时会产生更高的伪影。
解决此问题的一些方法:
Z排序可以通过多次渲染+深度测试+切换前面
来部分完成所以首先渲染所有实体,然后渲染Z-sorted透明对象,将正面设置为不面向摄像机的一侧。然后渲染相同的对象,前脸设置为侧面摄像头。你需要使用深度测试!!!这样您就不需要对透明对象的所有场景多边形进行排序。对于复杂的透明几何结果,结果不是100%正确,但结果通常足够好(特别是对于动态场景)。这就是这个输出的结果
这是一个玻璃杯,在这种情况下通过选择的混合功能在视觉上有点混乱,因为较暗的像素意味着2层玻璃故意不是一个错误。因此,开口看起来像是正面/背面交换了
对透明物体使用密度较小的几何体