Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将当前时间传递给OpenGL ES 2.0着色器以进行纹理动画:动画在特定时间后停止_Android_C++_Opengl Es_Opengl Es 2.0_Glsl - Fatal编程技术网

Android 将当前时间传递给OpenGL ES 2.0着色器以进行纹理动画:动画在特定时间后停止

Android 将当前时间传递给OpenGL ES 2.0着色器以进行纹理动画:动画在特定时间后停止,android,c++,opengl-es,opengl-es-2.0,glsl,Android,C++,Opengl Es,Opengl Es 2.0,Glsl,我想将当前时间传递给我的材质球以进行纹理动画,如下所示: float shaderTime = (float)((helper::getMillis() - device.stat.startTime)); glUniform1f(uTime, shaderTime); 要设置纹理动画,请执行以下操作: GLSL片段着色器: #if defined GL_ES && defined GL_FRAGMENT_PRECISION_HIGH #define HIGHFLOAT

我想将当前时间传递给我的材质球以进行纹理动画,如下所示:

float shaderTime = (float)((helper::getMillis() - device.stat.startTime));
glUniform1f(uTime, shaderTime);
要设置纹理动画,请执行以下操作: GLSL片段着色器:

#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分钟后:动画停止


有什么办法可以解决这个问题吗?

浮点数越大,精度就越低,而浮点数越大,就会导致口吃。此外,可以用于对纹理进行采样的坐标将有一个数值限制,因此在您遍历该坐标后将失败

你应该包装你的时间价值,这样它就不会超过某一点。例如,将1.5添加到整个三角形的UV坐标与添加0.5相同,因此只需包装您的值,使uTime*0.001始终介于0和1之间


也可以考虑切换时间为整数,这样就不会丢失精度。可以将该整数乘以着色器中的常量增量值。e、 g.如果帧速率为30fps,则乘以1/30。

如Muzza所说,用于纹理采样的坐标将有限制。这就导致了你所面临的问题

还有一些替代方法可以在不修改片段着色器的情况下进行纹理动画。 例如,修改投影矩阵以选择要查看的纹理部分。 在时间流逝时修改视图端口是另一种有帮助的方法