Алгоритм этой операции GPU? - PullRequest
0 голосов
/ 18 мая 2018

Я использую библиотеку, которая позволяет вычислять большие матричные операции на графическом процессоре, gpu.js .То, что я пытаюсь сделать, не очень сложно, я не думаю, но я, кажется, не могу понять алгоритм для этого.По сути, у меня есть буфер массива, хранящийся как r, g, b, повторяющийся для каждого пикселя, поэтому изображение 4x4 будет массивом из 64 значений.

Я хочу вывести изображение в X раз больше, чемвход, но с вычислением «ближайшего соседа», так что каждый пиксель просто становится квадратом 2x2, или 3x3, и т. д.

Таким образом, операция настроена следующим образом (обратите внимание, gpu.js требует массивы в качестве входных данных) иимейте в виду, что он перебирает выходные данные в полном размере, поэтому мне нужно найти правильные координаты, которые будут существовать в меньшем sourceBuffer, основываясь на текущем индексе в outputBuffer (индекс предоставляется библиотекой как this.thread.x).

var pixelateMatrix = gpu.createKernel(function(inputBuffer, width, height, scale) {
  var y = Math.floor(this.thread.x / (width[0] / scale[0]) * 4);
  var x = this.thread.x % ((width[0] / scale[0]) * 4);
  var remainder = this.thread.x % 4;
  return inputBuffer[x * (width[0] * 4) + y * 4 + remainder];
}).setOutput([width * height * 4]);

Это то, что я пытался, но сейчас странно выводить только текущую ширину экрана в качестве значения для каждой записи.

Какой правильный алгоритм для этого?Обычно я привык делать подобные вещи с циклом, повторяющимся над источником, но в этом случае мне приходится работать с каждым значением rgba каждого пикселя отдельно в одномерном массиве, и я не понимаю, как это сделать.

Также, очевидно, мне нужно сделать это как можно меньше операций.

1 Ответ

0 голосов
/ 18 мая 2018

Зависит немного, если вы храните строку или столбец элемента.Предполагая, что вы делаете мажор строки.

Каждая строка будет выглядеть как r1 g2 b1 a1 r2 g2 b2 a2 ...., затем будет следующая строка и так далее.Вам нужно знать, насколько велико изображение (по крайней мере, насколько велика каждая строка), я назову это N. Таким образом, для получения компонента c из строки x столбца y вам нужно value_pos = x * (N * 4) + y * 4 + c.Все здесь 0 проиндексировано.Вы можете использовать это значение как для чтения, так и для записи, просто обновите N между ними, поскольку они должны иметь разные размеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...