为了账号安全,请及时绑定邮箱和手机立即绑定

opengl 3.3 z-fighting ortho 2d 视图

opengl 3.3 z-fighting ortho 2d 视图

Go
动漫人物 2021-11-01 15:45:46
我在使用 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 过程的唯一区别是,我将所有顶点、uvs(精灵图集)、平移、旋转等打包到一个发送到顶点着色器的大包中,而不是为每个单独的对象调用 drawelements。有没有人对2d z战斗有补救措施?编辑:我正在添加一些图片以进一步描述场景:这些图像彼此相隔几秒钟拍摄。它们只是从左到右移动的纹理。当他们移动时;您从图像中看到,一个精灵与另一个精灵重叠,反之亦然,以非常快的速度来回等。另请注意,我的图像(精灵)是具有透明背景的 png。
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

如果您禁用了代码片段中所示的深度测试,那绝对不是深度战斗。

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


查看完整回答
反对 回复 2021-11-01
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

  1. 这可能是Z战斗

    通常的原因是:

    一些方法来解决这个问题:

    • 稍微改变重叠表面的大小/位置

    • 为 Z 缓冲区(深度)使用更多位

    • 使用线性或对数 Z 缓冲区

    • 增加Z-near或减少Z-far或两者都用于透视投影,您可以组合更多视锥体以获得高清 Z 范围

    • 有时有助于使用 glDepthFunc(GL_LEQUAL)

    • 片段位于相同的 Z 坐标或更接近 Z 坐标的精度

    • 片段离透视相机太远了,你离Z越远,精度越低

  2. 这可能是混合的问题。

    当您使用混合时,您需要进行一些不同的渲染。要正确渲染透明度,您必须对场景进行 Z 排序,否则可能会出现伪影。如果透明对象或它们附近的对象(附近有许多多边形边缘)的几何结构过于密集。此外,Z-fighting 会通过混合产生更高数量级的伪像。

    一些方法来解决这个问题:

    1. Z排序可以通过多遍渲染+深度测试+切换正面来部分完成

      所以首先渲染所有实体,然后渲染 Z 排序的透明对象,正面设置为不面向相机的一侧。然后使用正面设置为侧向相机渲染相同的对象。您需要为此使用深度测试!!!。这样您就不需要对场景的所有多边形进行排序,而只是对透明对象进行排序。对于复杂的透明几何体,结果并非 100% 正确,但结果通常已经足够好(尤其是对于动态场景)。这就是输出的样子

//img1.sycdn.imooc.com//617f9b630001920e09090623.jpg

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

  2. 对透明对象使用密度较低的几何体

  3. 摆脱Z-fighting问题


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信