Использование HTML5 шейдеров WebGL для вычислений - PullRequest
21 голосов
/ 14 сентября 2011

Мне кажется, что теоретически можно использовать WebGL для вычислений, таких как вычисления простых чисел или π или что-то в этом роде.Однако из того, что я мало видел, сам шейдер не написан на Javascript, поэтому у меня есть несколько вопросов:

  1. На каком языке являются шейдераминаписано в?
  2. Стоит ли даже пытаться делать такую ​​вещь, принимая во внимание, как работают шейдеры?
  3. Как можно передавать переменные назад и вперед во время выполнения?Или, если это невозможно, как передать информацию обратно после завершения выполнения шейдера?
  4. Поскольку это не Javascript, как можно обрабатывать очень большие целые числа (BigInteger в Java или перенесенная версия в Javascript)?
  5. Я бы предположил, что это автоматически компилирует скрипт, чтобы он работал на всех ядрах видеокарты, могу ли я получить подтверждение?

Если уместно, в данном конкретном случае яЯ пытаюсь учесть довольно большие числа как часть [очень] расширенного проекта compsci.

EDIT:

  1. Шейдеры WebGL написаны на GLSL.

Ответы [ 3 ]

19 голосов
/ 12 марта 2014

Я использовал вычислительные шейдеры из JavaScript в Chrome с использованием WebGL для решения задачи коммивояжера в качестве распределенного набора небольших задач оптимизации, решаемых в фрагментном шейдере, и в нескольких других задачах генетической оптимизации.

Проблемы:

  1. Вы можете поместить числа с плавающей запятой (r: 1.00, g: 234.24234, b: -22.0), но вы можете вывести только целые числа (r: 255, g: 255, b0)Это может быть преодолено путем кодирования одного числа с плавающей точкой в ​​4 целых числа в качестве вывода на фрагмент.Это на самом деле настолько тяжелая операция, что она почти побеждает цель для 99% проблем.Лучше решать проблемы с помощью простых целочисленных или логических под-решений.

  2. Отладка - это кошмар эпических масштабов, и сообщество в момент написания этого активно.

  3. Внедрение данных в шейдер в виде пиксельных данных ОЧЕНЬ медленно, считывание их происходит еще медленнее.Для примера: чтение и запись данных для решения проблемы TSP занимает 200 и 400 мс соответственно, фактическое время «рисования» или «вычисления» этих данных составляет 14 мс.Для того чтобы ваш набор данных можно было использовать правильно, он должен быть достаточно большим.

  4. JavaScript слабо типизирован (на поверхности ...), тогда как OpenGL ES строго типизирован.Чтобы взаимодействовать, мы должны использовать такие вещи, как Int32Array или Float32Array в JavaScript, который кажется неудобным и стеснительным в языке, обычно рекламируемом за его свободы.

  5. Поддержка большого числа сводится к использованию 5или 6 текстур входных данных, объединяющих все эти данные пикселей в единую числовую структуру (каким-то образом ...), затем осмысленно работающую с этим большим числом.Очень хакерский, совсем не рекомендуется.

15 голосов
/ 14 сентября 2011

В настоящее время ведется работа над проектом, который в значительной степени соответствует тому, что вы делаете - WebCL . Я пока не верю, что он есть в любом браузере.

Чтобы ответить на ваши вопросы:

  1. Я уже ответил, наверное!
  2. Вероятно, не стоит делать в WebGL. Если вы хотите поиграть с вычислениями на GPU, вам, скорее всего, повезет, если вы будете делать это вне браузера на данный момент, поскольку наборы инструментов там гораздо более развиты.
  3. Если вы застряли в WebGL, один из подходов может заключаться в том, чтобы записать результаты в текстуру и прочитать их обратно.
  4. С трудом. Подобно процессорам, графические процессоры могут работать только с определенными значениями размера, а все остальное должно быть эмулировано.
  5. Да.
6 голосов
/ 09 мая 2014

Однажды я облажался с такими вещами.В ответ на ваш третий вопрос я передал vars обратно n 'uniforms'

* edit - оглядываясь назад, теперь также использовал векторные атрибуты для передачи данных извне.

вы будетенужно запустить mamp или что-то еще, чтобы это работало локально ... https://github.com/byteface/GTP/tree/master/play/simplified

Я использовал пиксели для представления букв алфавита и делал поиск строк с помощью шейдеров.Это было удивительно быстро.быстрее, чем основанные на процессоре собственные программы поиска.то есть поиск в целой книге экземпляров одного слова происходит быстрее в браузере на графическом процессоре, чем в облегченной программе, такой как textedit.и я использовал только одну текстуру.

...