在SceneKit中使用着色器修改器为纹理设置动画会导致纹理随着时间的推移而抖动



我正在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轴。

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

另外:我不知道如何从着色器代码中记录数据。如果能够查看像"u_time"这样的变量并准确地了解发生了什么,那将是非常棒的。

这绝对是一个浮点精度问题。您可能应该尝试对(utime*3.0)进行模运算,以便它在合理的范围内循环。

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

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

现在假设您有N纹理。则mod(u_time, N)将从0每秒增加到N-1,然后返回到0。如果将其除以N,则得到纹理坐标,而不需要SCNWrapModeRepeat

如果希望图像每0.04秒更改一次(每秒25次),请使用mod(25 * u_time, N) / N

最新更新