Чтение необработанных 3D текстур и срезов куба - PullRequest
2 голосов
/ 19 октября 2011

Чтение необработанной 3d (256x256x256 ячеек) текстуры (8 бит) с использованием следующего:

f = fopen(file, "rb");
if (f == NULL) return;
int size = width * height * depth;
data = new unsigned char[size*3];
fread(data, 3, size, f);
image = reinterpret_cast<rgb *>(data);
fclose(f);

где изображение rgba

typedef unsigned char byte;

    typedef struct {
        byte r;
        byte g;
        byte b;
    } rgb;

Теперь я хочу «нарезать» куб в некотором перпендикулярном направлении и отобразить данные с помощью:

glTexImage2D()

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

Могу ли я отобразить данные в более простой формат, чтобы я мог использовать интуитивно понятный синтаксис срезов?

1 Ответ

0 голосов
/ 20 октября 2011

Это просто трехмерный массив.Выберите две оси для сканирования в стандартном 2D-шаблоне доступа и измените третью, чтобы изменить срезы:

for( unsigned int slice = 0; i < numSlices; ++i )
{
    for( unsigned int x = 0; x < xSize; ++x )
    {
        for( unsigned int y = 0; y < ySize; ++y )
        {
            // XY slice
            output[x][y] = array[x][y][slice];

            // XZ slice
            output[x][y] = array[x][slice][y];

            // YZ slice
            output[x][y] = array[slice][x][y];
        }
    }
}

Вы можете стать более привлекательным с Boost.MultiArray.

...