opengl 3.3 z-fighting ortho 2d view

时间:2015-08-17 02:18:36

标签: opengl graphics go opengl-es

我在使用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战斗有补救措施?

编辑:

我正在添加一些图片以进一步描述该场景:

img1

img2

这些图像彼此间隔几秒钟拍摄。它们只是纹理从左向右移动。随着他们的移动;从图像中可以看出,一个精灵过快地反复出现,反之亦然,来回等等。

另请注意,我的图像(精灵)是具有透明背景的png ..

2 个答案:

答案 0 :(得分:2)

如果您已禁用深度测试,则绝对不是深度战斗,如代码段所示。

“我将所有顶点,uvs(精灵地图集),翻译,旋转等包装在一个发送到顶点着色器的大包中。” - 您需要查看添加精灵的顺序。也许由于某种原因它不一致。

答案 1 :(得分:1)

  1. 这可能是Z战斗

    通常的原因是:

    • 片段处于相同的Z坐标或接近Z坐标的准确度
    • 碎片距离透视相机太远,透视投影距离 Z近的精度越低

    解决此问题的一些方法:

    • 稍微改变重叠表面的大小/位置
    • 为Z-Buffer(深度)使用更多位
    • 使用线性或对数Z缓冲区
    • 增加 Z-near 或减少 Z-far 或两者以进行透视投影,您可以combine more frustrums获得高清Z范围
    • 有时可以帮助您使用glDepthFunc(GL_LEQUAL)
  2. 这可能是混合的问题。

    当您使用混合时,您需要以不同的方式渲染。要正确渲染透明度,必须对场景进行Z排序,否则可能会发生伪影。如果透明物体或其附近的物体有太多密集的几何体(附近有许多多边形边缘)。此外,Z-fighting在混合时会产生更高的伪影。

    解决此问题的一些方法:

    1. Z排序可以通过多次渲染+深度测试+切换前面

      来部分完成

      所以首先渲染所有实体,然后渲染Z-sorted透明对象,将正面设置为不面向摄像机的一侧。然后渲染相同的对象,前脸设置为侧面摄像头。你需要使用深度测试!!!这样您就不需要对透明对象的所有场景多边形进行排序。对于复杂的透明几何结果,结果不是100%正确,但结果通常足够好(特别是对于动态场景)。这就是这个输出的结果

      example

      这是一个玻璃杯,在这种情况下通过选择的混合功能在视觉上有点混乱,因为较暗的像素意味着2层玻璃故意不是一个错误。因此,开口看起来像是正面/背面交换了

    2. 对透明物体使用密度较小的几何体

    3. 摆脱Z-fighting问题