在我的应用程序中,我将平面渲染到平面上。下平面具有Z = 0,第二平面具有Z = 0.5。如果我渲染它们(低于第一个),我会丢失部分渲染,如图所示
在iPhone 4和桌面(使用ES模拟器)上,一切都正确无问题。什么可能导致这个问题?
场景的其他部分也会出现同样的问题,例如轨道,管道(此图片上的绿色和蓝色)。当我移动相机时出现问题
答案 0 :(得分:6)
好的......我已经解决了这个问题。我的着色器中存在导致深度缓冲区被填充的问题。 我用过
precision mediump float;
这导致几何不精确,Z = 0与Z = 0.5混合在一起。
将精度更改为highp
解决了这个问题。
底线。这个"优化"是一个巨大的错误,并且从不在顶点着色器中使用mediump(除非你面临一些性能影响甚至它不值得。渲染的差异并不明显)
答案 1 :(得分:1)
(这是对你自己的答案的回应,这只是部分正确)
由于场景的Z值映射到z缓冲区,你有一个Z战斗的情况。这可能是非线性映射(1 / f(Z)是常见的),但我不确定浮点z缓冲区。
你的场景非常简单,虽然在问题上分块更多的z缓冲区是一个部分解决方案,但这是以性能为代价的,而不是真正理解这个问题。即使您可以在平台上使用最高精度的z缓冲区,您也可能会再次遇到同样的问题!
看看你的场景;您希望将3D场景中的z范围映射到z缓冲区可以存储的最大可能值范围,否则您将浪费z缓冲区可以存储的数字范围块。每帧计算此映射可能很有用,具体取决于您稍后要对z缓冲区执行的操作。
查看here进行一些计算。注意,对于浮点z缓冲区,如果你丢掉很多小数字,那么你可能会比使用整数1更糟糕 - 这就是浮点数的绝大多数可存储值的位置!