Получите дополнительную производительность от фрагментного шейдера OpenGL

Я набрал 58 кадров в секунду с шейдером OpenGL, над которым я работаю, на очень старом устройстве Android, которое я использую для тестирования. Я переместил все, что мог, в вершинный шейдер, и я почти готов, но уже не могу представить, как его оптимизировать.

precision mediump float;
varying vec3 uvx3;
varying mat3 matb;
varying vec2 uv;
varying vec2 uv2;

float f = 1./dot(uv,uv);
vec2 p = uv2*f;
//vec2 p = uv2/(uv.x*uv.x+uv.y*uv.y);
//vec2 p = uv2/dot(uv,uv);
vec3 col = 1./abs(p.yyy+cos(p.xxx + uvx3));

void main()
{
//    gl_FragColor.rgb = matb * (1./abs(p.yyy+sin(p.xxx + uvx3)));
    gl_FragColor.rgb = matb * col;
}

Вы можете увидеть закомментированные вещи, которые я пробовал, но ни одно из них не помогло достичь отметки в 60 кадров в секунду. Код можно резюмировать (по-прежнему 58 FPS):

precision mediump float;
varying vec3 uvx3;
varying mat3 matb;
varying vec2 uv;
varying vec2 uv2;

vec2 p = uv2/dot(uv,uv);

void main()
{
    gl_FragColor.rgb = matb * (1./abs(p.yyy+sin(p.xxx + uvx3)));
}

Любая помощь приветствуется.

PS: не знаю, если не установка gl_FragColor.a это плохая практика, но я получаю 3 дополнительных кадра в секунду, не создавая vec4 в конце концов.

КОНТЕКСТ: Это для OpenGL 2.0. Это не трехмерная сцена, а всего два треугольника на весь экран, поэтому вершинный шейдер не является проблемой. Я просто вычисляю вариации там: время (uvx3), цвета (matb) и два набора координат (uv а также uv2).

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *