Соседство массива 1D, представляющего трехмерные данные - PullRequest
0 голосов
/ 31 октября 2018

мне нужно найти соседние элементы массива в одном одномерном массиве, с точкой отсчета является верхним левым элементом. Входящие исходные данные - это одномерный массив данных пикселей RGBA в порядке следования строк, размер которого совпадает с размером массива W * H. Мне нужно использовать соседей для расчета мипмапов. В двумерном массиве я бы использовал следующее:

int i;
int j;
int array[H][W]; // width by height

array[j + 0][i + 0]; // top-left
array[j + 0][i + 1]; // top-right
array[j + 1][i + 0]; // bottom-left
array[j + 1][i + 1]; // bottom-right

Насколько я понимаю, в общем, индексы линейных массивов - это полиномы, принимающие форму: i + j * W + k * W * H ... Это то, что у меня есть.

int i; // 0 < i < W / 2
int j; // 0 < j < H / 2
int array[W * H];

i * 2 + (j * 2 + 0) * W + 0; // top-left
i * 2 + (j * 2 + 0) * w + 1; // top-right
i * 2 + (j * 2 + 1) * W + 0; // bottom-left
i * 2 + (j * 2 + 1) * W + 1; // bottom right

Магические числа заставляют меня насторожиться. Я не уверен, как обобщить это в одномерный массив, представляющий трехмерные данные (двумерный массив из 4 векторов), или что вышеупомянутое даже разумно. Общую форму было бы неплохо иметь в случае, если мне нужен более широкий фильтр для меньших мип-карт, поскольку понижающая дискретизация уже пониженной дискретизации текстуры приводит к дополнительному алиасингу, в отличие от выборки непосредственно из исходных данных и использования более широкого фильтра.

...