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 очень многословный, и для его выполнения требуется много повторений.
Большое спасибо за ответ, WacławJasper. В настоящее время я занимаюсь главным образом в книге Руководство по программированию WebGL, и я хорошо разбираюсь в общем потоке программ WebGL на этом этапе. Я также сделал несколько программ с текстурами, но в каждом случае речь шла об изображении и использовании текстуры для сопоставления его с поверхностью. Я не совсем уверен, как мне нужно изменить код JS или GLSL для произвольного ввода значений RGBA для каждого пикселя. Это информация, которую я надеялся получить. Помимо этого, я могу представить, как использовать GLSL для многократного объединения нескольких текстур и т. Д., Чтобы ... – HartleySan
Сделайте некоторые вычисления очень быстро. Наконец, вы много помогли, обратившись к функции 'gl.readPixels()', о которой я не знал о существовании для чтения результата сгенерированной текстуры/холста. Если вы можете предложить более подробную информацию о том, как вводить произвольные значения RGBA в каждый пиксель для текстуры, это было бы высоко оценено. Спасибо. – HartleySan
«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 –