Задать вопрос

Почему WebGL такой медленный (с пустым шейдером)?

Вершинный и фрагментный шейдеры пусты:
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);
}
  • Вопрос задан
  • 1523 просмотра
Подписаться 7 Оценить 7 комментариев
Ответ пользователя asd111 К ответам на вопрос (3)
@asd111
Windows ограничивает fps до 60 для webgl, да и в целом для opengl и direct3d.
Я не занимался webgl, но скорее всего можно по старинке узнать сколько миллисекунд уходит на отрисовку одного кадра и так узнать примерный fps по формуле
1000/количество_миллисекунд_на_отрисовку_одного_кадра

Посмотрите https://www.shadertoy.com/view/Ms2SD1 если показывает меньше 40 fps в окне, значит проблема в связке ОС—браузер—драйвера видеокарты.
Если пример показывает 60 fps значит вам нужно найти другие уроки по webgl.
Ответ написан