我想像这样将当前时间传递给我的纹理动画着色器:
float shaderTime = (float)((helper::getMillis() - device.stat.startTime));
glUniform1f(uTime, shaderTime);
要为纹理制作动画,我会这样做: GLSL fragment 着色器:
#if defined GL_ES && defined GL_FRAGMENT_PRECISION_HIGH
#define HIGHFLOAT highp
#endif
uniform HIGHFLOAT float uTime;
...
void main()
{
vec2 coord = vTexCoord.xy;
coord.x += uTime*0.001;
gl_FragColor = texture2D(uTex, coord);
}
我的问题是:如果我运行程序一段时间:
第一分钟:一切都很好
~5 分钟后:动画断断续续
~10 分钟后:动画停止
有什么解决办法吗?
最佳答案
随着数字变大, float 会失去精度,这将导致卡顿。此外,您可以用来对纹理进行采样的坐标将有数值限制,因此在您超过它后将会失败。
你应该包装你的时间值,这样它就不会超过某个点。例如,将 1.5 添加到整个三角形的 UV 坐标与添加 0.5 相同,因此只需包装您的值,使 uTime*0.001 始终介于 0 和 1 之间。
您还可以将切换时间考虑为一个整数,这样它就不会丢失精度。您可以将该整数乘以着色器中的常量增量值。例如如果您的帧率为 30fps,则乘以 1/30。
关于android - 将当前时间传递给 OpenGL ES 2.0 着色器以进行纹理动画 : animation stops after certain time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21006074/