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

Почему 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);
}
  • Вопрос задан
  • 1510 просмотров
Подписаться 7 Оценить 7 комментариев
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы