Я набрал 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
).