簡體   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