Вершинный и фрагментный шейдеры пусты:
attribute vec3 a_position;
void main() {
gl_Position = vec4(a_position, 1.0);
}
void main() {
gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
}
При разрешении 3840x2160 выдаёт всего лишь 20 FPS на видеокарте Intel.
На Nvidia дела обстоят лучше — выдаёт 60 FPS, но грузит видеокарту на 40%.
При усложнении шейдера загруженность GPU не увеличивается и FPS остаётся таким же — получается сами шейдеры исполняются быстро, а вот их вызовы очень дороги. Только вот настолько дороги, что я даже не могу вывести картинку 60 FPS. С чем связана такая низкая производительность?
Кстати, на
shadertoy тоже работает медленно, но на 20% быстрее, чем у меня (при одинаковом размере вьюпорта). Почему так — не знаю. (Чтобы размер вьюпорта был одинаковым, на shadertoy я ставил 50% масштаб, иначе там рисовался только 1 пиксель на 4.)
Я также пробовал использовать WebGL 2 и #version 300 es, но это ничего не меняет.
PS. Рендер выводит один прямоугольник (2 треугольника) на весь размер вьюпорта:
const triangle_strip = new Float32Array([
-1.0, 1.0, 0.0,
1.0, 1.0, 0.0,
-1.0,-1.0, 0.0,
1.0,-1.0, 0.0,
]);
const buf_triangle_strip = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buf_triangle_strip);
gl.bufferData(gl.ARRAY_BUFFER, triangle_strip, gl.STATIC_DRAW);
gl.vertexAttribPointer(loc_a_position, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(loc_a_position);
render();
function render() {
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
requestAnimationFrame(render, canvas);
}