0

Android アプリケーション用のシェーダー コードをいくつか作成しました。webgl バージョンで完全に正常に動作する時間依存のアニメーションがいくつかあります。シェーダー コードは以下にありますが、完全なバージョンはここにあります。

vec3 bip(vec2 uv, vec2 center)
{
vec2 diff = center-uv; //difference between center and start coordinate
float r = length(diff); //vector length
float scale = mod(u_ElapsedTime,2.); //it is equal 1 every 2 seconds and trigerring function
float circle = smoothstep(scale, scale+cirleWidth, r)
   * smoothstep(scale+cirleWidth,scale, r)*4.;

return vec3(circle);
}

関数の return は Fragcolor で色のベースとして使用されます。

u_ElapsedTime はユニフォーム経由でシェーダーに送信されます。

glUniform1f(uElapsedTime,elapsedTime);

「onDrawFrame」からシェーダーに送信される時間データ:

public void onDrawFrame(GL10 gl) {
    glClear(GL_COLOR_BUFFER_BIT);
    elapsedTime = (SystemClock.currentThreadTimeMillis()-startTime)/100f;
    //Log.d("KOS","time " + elapsedTime);
    scannerProgram.useProgram(); //initialize shader
    scannerProgram.setUniforms(resolution,elapsedTime,rotate); //send uniforms to shader
    scannerSurface.bindData(scannerProgram); //get attribute location
    scannerSurface.draw(); //draw vertices with given attributes
}

だから、すべてが完全にうまく見えます。それにもかかわらず、しばらくすると、いくつかのラグがあり、フレームの量が最初から少ないように見えます。最終的には、その機能については、1 サイクルあたり 1 ~ 2 フレームだけになる可能性があります。同時に、opengl自体にラグがあるようには見えません。たとえば、画像を回転させてもラグが見られないためです。

その遅れの理由は何ですか??

upd: binddata のコード:

public void bindData(ScannerShaderProgram scannerProgram) {
    //getting location of each attribute for shader program
    vertexArray.setVertexAttribPointer(
            0,
            scannerProgram.getPositionAttributeLocation(),
            POSITION_COMPONENT_COUNT,
            0
    );
4

1 に答える 1

0

精度の問題のように思えます。シェーダーから次の行を取得してみてください。

float scale = mod(u_ElapsedTime,2.);

代わりにCPUで実行します。例えば

elapsedTime = ((SystemClock.currentThreadTimeMillis()-startTime)%200)/100f;
于 2016-08-20T16:50:02.920 に答える