2 回答
TA贡献1798条经验 获得超3个赞
如果您禁用了代码片段中所示的深度测试,那绝对不是深度战斗。
“我将所有顶点、uvs(精灵图集)、平移、旋转等打包在一个大包中,发送到顶点着色器。” - 您需要查看添加精灵的顺序。也许由于某种原因它不一致。
TA贡献1804条经验 获得超2个赞
这可能是Z战斗
通常的原因是:
一些方法来解决这个问题:
稍微改变重叠表面的大小/位置
为 Z 缓冲区(深度)使用更多位
使用线性或对数 Z 缓冲区
增加Z-near或减少Z-far或两者都用于透视投影,您可以组合更多视锥体以获得高清 Z 范围
有时有助于使用
glDepthFunc(GL_LEQUAL)
片段位于相同的 Z 坐标或更接近 Z 坐标的精度
片段离透视相机太远了,你离Z越远,精度越低
这可能是混合的问题。
当您使用混合时,您需要进行一些不同的渲染。要正确渲染透明度,您必须对场景进行 Z 排序,否则可能会出现伪影。如果透明对象或它们附近的对象(附近有许多多边形边缘)的几何结构过于密集。此外,Z-fighting 会通过混合产生更高数量级的伪像。
一些方法来解决这个问题:
Z排序可以通过多遍渲染+深度测试+切换正面来部分完成
所以首先渲染所有实体,然后渲染 Z 排序的透明对象,正面设置为不面向相机的一侧。然后使用正面设置为侧向相机渲染相同的对象。您需要为此使用深度测试!!!。这样您就不需要对场景的所有多边形进行排序,而只是对透明对象进行排序。对于复杂的透明几何体,结果并非 100% 正确,但结果通常已经足够好(尤其是对于动态场景)。这就是输出的样子
这是一个玻璃杯,在这种情况下选择的混合功能在视觉上有点混乱,因为较暗的像素意味着故意使用 2 层玻璃,这不是错误。因此,开口看起来就像是正面/背面互换了
对透明对象使用密度较低的几何体
摆脱Z-fighting问题
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报