Android OpenGLES 2.0 своевременная зависимая работа в шейдере со временем замедляется

android opengl-es glsl shader mod

106 просмотра

1 ответ

Я написал некоторый код шейдера для моего приложения для 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);
}

Возврат функции используется во 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
}

Так что все выглядит хорошо. Тем не менее, через некоторое время кажется, что есть некоторые лаги и количество кадров меньше, чем с самого начала. В конце это может быть как один-два кадра на цикл для этой функции. В то же время не похоже, что у 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
    );
Автор: константин украинский Источник Размещён: 08.11.2019 11:09

Ответы (1)


0 плюса

Решение

Звучит как проблемы с точностью. Попробуйте взять эту строку из своего шейдера:

float scale = mod(u_ElapsedTime,2.);

И вместо этого выполните это на процессоре. например

elapsedTime = ((SystemClock.currentThreadTimeMillis()-startTime)%200)/100f;
Автор: Columbo Размещён: 20.08.2016 04:50
Вопросы из категории :
32x32