Почему 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);
}
  • Вопрос задан
  • 1488 просмотров
Пригласить эксперта
Ответы на вопрос 3
(хотя и в GPU тоже копируется, но опять же, 60 раз).

В этом и проблема. Вершины перекидывать на карту на каждом фрейме - это бред в любом случае (даже если сейчас это не основная причина тормозов). Буферы вершин на то и нужны, чтобы закинуть их один раз.

gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
Вот так делать нельзя. Создание и заюзание буфера разделили не для того чтобы вам жизнь усложнять. Попробуйте избавиться от этого и сделайте нормально.
Ответ написан
@Q001
Может, вам посмотреть исходный текст проекта webgl Quake?
https://habrahabr.ru/post/177159/
Ответ написан
@asd111
Windows ограничивает fps до 60 для webgl, да и в целом для opengl и direct3d.
Я не занимался webgl, но скорее всего можно по старинке узнать сколько миллисекунд уходит на отрисовку одного кадра и так узнать примерный fps по формуле
1000/количество_миллисекунд_на_отрисовку_одного_кадра

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы