Каков наиболее эффективный способ вычисления градиента для данных вокселей фиксированного размера, таких как исходный код ниже. Обратите внимание, что мне нужен градиент в любой точке пространства. Градиенты будут использоваться для оценки нормалей в реализации марширующих кубов.
#import <array>
struct VoxelData {
VoxelData(float* data, unsigned int xDim, unsigned int yDim, unsigned int zDim)
:data(data), xDim(xDim), yDim(yDim), zDim(zDim)
{}
std::array<float,3> get_gradient(float x, float y, float z){
std::array<float,3> res;
// compute gradient efficiently
return res;
}
float get_density(int x, int y, int z){
if (x<0 || y<0 || z<0 || x >= xDim || y >= yDim || z >= zDim){
return 0;
}
return data[get_element_index(x, y, z)];
}
int get_element_index(int x, int y, int z){
return x * zDim * yDim + y*zDim + z;
}
const float* const data;
const unsigned int xDim;
const unsigned int yDim;
const unsigned int zDim;
};
Обновление 1 Демонстрационный проект проблемы можно найти здесь:
https://github.com/mortennobel/OpenGLVoxelizer
В настоящее время результат выглядит так, как показано на рисунке ниже (на основе кода MooseBoys):
Обновление 2 Решение, которое я ищу, должно давать довольно точные градиенты, поскольку они используются в качестве нормалей в визуализации, и следует избегать визуальных артефактов, подобных приведенным ниже.
Обновление 2. Решение из пользовательского примера: