繁体   English   中英

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

[英]Passing current time to OpenGL ES 2.0 shader for texture-animation: animation stops after certain time

我想将当前时间传递给我的Shader纹理动画,如下所示:

float shaderTime = (float)((helper::getMillis() - device.stat.startTime));
glUniform1f(uTime, shaderTime);

为我的纹理设置动画:GLSL Fragment Shader:

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

任何想法如何解决这一问题?

漂浮物随着它们变大而失去精确度,这将导致随着数量变大而出现口吃。 此外,您可以用来对纹理进行采样的坐标将具有数字限制,因此在您查看之后将失败。

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

您还可以考虑将时间切换为整数,以便不会丢失精度。 您可以在着色器中将此整数乘以常量delta值。 例如,如果您的帧率为30fps,则乘以1/30。

就像Muzza所说,用于采样纹理的坐标将有一个限制。 这会导致您遇到的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM