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
);