随着时间的推移,Android opengl es 2.0在着色器中的及时相关操作变得更慢

时间:2016-08-20 10:14:27

标签: android opengl-es glsl shader mod

我为我的Android应用程序编写了一些着色器代码。它有一些依赖于时间的动画,在webgl版本上完全正常工作,着色器代码如下,但可以找到完整版本here

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

函数的返回在Fragcolor中用作颜色的基础。

u_ElapsedTime通过uniform发送到着色器:

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
}

所以一切看起来都很好。然而,经过一段时间后,它看起来有一些滞后,并且帧的数量从一开始就比较少。最后,对于该功能,每个角色可能只有两个帧。与此同时,似乎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
    );

1 个答案:

答案 0 :(得分:0)

听起来像精确问题。尝试从着色器中获取此行:

float scale = mod(u_ElapsedTime,2.);

然后在CPU上执行它。例如

elapsedTime = ((SystemClock.currentThreadTimeMillis()-startTime)%200)/100f;