android - 将当前时间传递给 OpenGL ES 2.0 着色器以进行纹理动画 : animation stops after certain time

标签 android c++ opengl-es opengl-es-2.0 glsl

我想像这样将当前时间传递给我的纹理动画着色器:

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/

相关文章:

android - ListView 和带倒数计时器的项目

android - AlertDialog 否定按钮默认高亮显示

android - 如何在我的应用程序中添加更多权限/事件?

android - 使用 View 绑定(bind)显示空白屏幕

ios - OpenGL ES 2.0 多个着色器程序 - 纹理渲染不再工作

c++ - OpenGL ES 顶点着色器中的动态大小数组;用于混合形状/变形目标

.net - 获取静态库的 ResourceManager

c++ - 如果不满足 "if criteria",默认返回什么?重载下标运算符

c++ - 带有 Visual Studio 2013 的 Qt 5.4 - QtCored.dll 缺失

objective-c - iOS OpenGL 层和 UIScrollView