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