[英]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.