猿问

opengl 3.3 z-fighting ortho 2d 视图

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


编辑:


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

http://img2.mukewang.com/617f9b4a0001806106140434.jpg

这些图像彼此相隔几秒钟拍摄。它们只是从左到右移动的纹理。当他们移动时;您从图像中看到,一个精灵与另一个精灵重叠,反之亦然,以非常快的速度来回等。

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


动漫人物
浏览 160回答 2
2回答

呼如林

如果您禁用了代码片段中所示的深度测试,那绝对不是深度战斗。“我将所有顶点、uvs(精灵图集)、平移、旋转等打包在一个大包中,发送到顶点着色器。” - 您需要查看添加精灵的顺序。也许由于某种原因它不一致。

慕婉清6462132

这可能是Z战斗通常的原因是:一些方法来解决这个问题:稍微改变重叠表面的大小/位置为 Z 缓冲区(深度)使用更多位使用线性或对数 Z 缓冲区增加Z-near或减少Z-far或两者都用于透视投影,您可以组合更多视锥体以获得高清 Z 范围有时有助于使用 glDepthFunc(GL_LEQUAL)片段位于相同的 Z 坐标或更接近 Z 坐标的精度片段离透视相机太远了,你离Z越远,精度越低这可能是混合的问题。当您使用混合时,您需要进行一些不同的渲染。要正确渲染透明度,您必须对场景进行 Z 排序,否则可能会出现伪影。如果透明对象或它们附近的对象(附近有许多多边形边缘)的几何结构过于密集。此外,Z-fighting 会通过混合产生更高数量级的伪像。一些方法来解决这个问题:Z排序可以通过多遍渲染+深度测试+切换正面来部分完成所以首先渲染所有实体,然后渲染 Z 排序的透明对象,正面设置为不面向相机的一侧。然后使用正面设置为侧向相机渲染相同的对象。您需要为此使用深度测试!!!。这样您就不需要对场景的所有多边形进行排序,而只是对透明对象进行排序。对于复杂的透明几何体,结果并非 100% 正确,但结果通常已经足够好(尤其是对于动态场景)。这就是输出的样子这是一个玻璃杯,在这种情况下选择的混合功能在视觉上有点混乱,因为较暗的像素意味着故意使用 2 层玻璃,这不是错误。因此,开口看起来就像是正面/背面互换了对透明对象使用密度较低的几何体摆脱Z-fighting问题
随时随地看视频慕课网APP

相关分类

Go
我要回答