在SceneKit中使用着色器修改器对纹理进行animation处理会导致长时间的抖动纹理

我正在为iOS的SceneKit写一个场景。

我正在尝试使用精灵表应用纹理到一个对象。 我用这个代码遍历该表中的图像:

happyMaterial = [SCNMaterial new]; happyMaterial.diffuse.contents = happyImage; happyMaterial.diffuse.wrapS = SCNWrapModeRepeat; happyMaterial.diffuse.wrapT = SCNWrapModeRepeat; happyMaterial.shaderModifiers = @{ SCNShaderModifierEntryPointGeometry : @"_geometry.texcoords[0] = vec2((_geometry.texcoords[0].x+floor(u_time*30.0))/10.0, (_geometry.texcoords[0].y+floor(u_time*30.0/10.0))/7.0);" }; 

一切都很好。 除了随着时间的推移,纹理开始变得随机抖动,特别是沿着x轴。

有人提到这可能是因为“浮点精度问题”,但我不知道如何诊断或修复这个问题。

另外:我不知道如何logging来自着色器代码的数据。 能够查看诸如“u_time”之类的variables并查看到底发生了什么真是太棒了。

这绝对是一个浮点精度问题。 你应该试着在(u_time * 30.0)上做一个模(modulo),以便它在合理的范围内循环。

如果你想遍历图像,你的纹理坐标必须在短时间内保持不变(例如1秒)。

u_time类似于CACurrentMediaTime() ,这是以秒为单位的时间。

现在让我们假设你有N纹理。 那么mod(u_time, N)将从0N-1每秒增加,然后回到0 。 如果你除以N你得到你的纹理坐标,你不需要SCNWrapModeRepeat

如果你希望你的图像每0.04秒(每秒25次)改变,那么使用mod(25 * u_time, N) / N