2015-12-31 5 views
2

Я слышал, что вы можете использовать WebGL для общих вычислений (GPGPU), создавая текстуры и используя значения RGB (или что-то в этом роде для выполнения вычислений). Как это возможно, и может ли кто-нибудь, пожалуйста, представить простой пример с кодом?Как использовать WebGL для общих вычислений (GPGPU)?

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

спасибо.

ответ

8

WebGL (OpenGL) позволяет создавать шейдерные программы, которые позволяют запускать собственный код приложения на графическом процессоре. Обычно это используется для расчета позиции и цвета для отображения. Для этого вы загружаете данные GPU и запускаете свой собственный код, используя данные, которые вы загружали на GPU. Как вы можете себе представить, возможность передавать произвольные данные и выполнять произвольные команды = возможность общего вычисления (в пределах).

Вы также не обязаны визуализировать экран непосредственно (задний буфер), но по текстуре по вашему выбору. Но одно из ограничений (базовая спецификация) заключается в том, что вы можете выводить только 4 * 8-битное значение RGBA для каждого пикселя. Как вы вычисляете этот 32-битный RGBA и как вы его интерпретируете, это зависит от вас.

В качестве примера, возможно, вы хотите запустить множество вычислений sqrt. Сначала вы создаете текстуру с каждым «пикселем» на текстуре, являющейся вашим начальным значением (поплавок, упакованный в RGBA); то на GPU вы поручаете ему делать вычисления sqrt для каждого пикселя и выводить результаты; результатом является мусор в качестве цвета экрана, но если вы напишете функцию распаковки, которая конвертирует RGBA обратно в float, то у вас есть калькулятор sqrt на вашем GPU!

Кроме того, текстура представляет собой не что иное, как массив значений, упакованных в определенном формате. Например, попробуйте canvas.getContext("2d").getImageData(0,0,10,10). Эквивалент в WebGL равен gl.readPixels().

Отсутствие примера из меня, однако, WebGL api очень многословный, и для его выполнения требуется много повторений.

+0

Большое спасибо за ответ, WacławJasper. В настоящее время я занимаюсь главным образом в книге Руководство по программированию WebGL, и я хорошо разбираюсь в общем потоке программ WebGL на этом этапе. Я также сделал несколько программ с текстурами, но в каждом случае речь шла об изображении и использовании текстуры для сопоставления его с поверхностью. Я не совсем уверен, как мне нужно изменить код JS или GLSL для произвольного ввода значений RGBA для каждого пикселя. Это информация, которую я надеялся получить. Помимо этого, я могу представить, как использовать GLSL для многократного объединения нескольких текстур и т. Д., Чтобы ... – HartleySan

+0

Сделайте некоторые вычисления очень быстро. Наконец, вы много помогли, обратившись к функции 'gl.readPixels()', о которой я не знал о существовании для чтения результата сгенерированной текстуры/холста. Если вы можете предложить более подробную информацию о том, как вводить произвольные значения RGBA в каждый пиксель для текстуры, это было бы высоко оценено. Спасибо. – HartleySan

+2

«gl.texImage2D» позволяет вам указать TypeArray в качестве источника данных. Типичная текстура RGBA структурирована как [R, G, B, A, R, G, B, A ...], поэтому вы можете написать JS-код для построения массива и непосредственного манипулирования им. Я предлагаю сначала поиграть с 2d-контекстом и '.getImageData'. Может быть, что-то вроде фильтра оттенков серого для начинающих? Имейте в виду это: http://stackoverflow.com/questions/7869752/javascript-typed-arrays-and-endianness –