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