Я использую библиотеку, которая позволяет вычислять большие матричные операции на графическом процессоре, 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 каждого пикселя отдельно в одномерном массиве, и я не понимаю, как это сделать.
Также, очевидно, мне нужно сделать это как можно меньше операций.