Как работает система координат для 3D текстур в OpenGL?

Я пытаюсь писать и читать с 3D-текстуры, но кажется, что мое отображение неверно. Я использовал Render Doc, чтобы проверить текстуры, и они выглядят хорошо.

Случайный слой этой объемной текстуры выглядит так:

Так что просто синий для обозначения отсутствия и некоторые зеленые для обозначения присутствия.

Координаты, которые я вычисляю при записи в каждый слой, вычисляются в вершинном шейдере как:

pos.x = (2.f*pos.x-width+2)/(width-2);
pos.y = (2.f*pos.y-depth+2)/(depth-2);

pos.z -= level;
pos.z *= 1.f/voxel_size;

gl_Position = pos;

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

Важно отметить, что сейчас voxel_size равен 1, а масштаб текстуры должен быть 1 к 1 с размерами сцены. По сути, каждый пиксель в текстуре представляет воксель 1x1x1 в сцене.

Далее я пытаюсь получить значения текстуры следующим образом:

vec3 pos = vertexPos;
pos.x = (2.f*pos.x-width+2)/(width-2);
pos.y = (2.f*pos.y-depth+2)/(depth-2);

pos.z *= 1.f/(4*16);

outColor = texture(voxel_map, pos);

Где vertexPos - это глобальная позиция вершины в сцене. Однако координата z может быть совершенно неправильной (я не уверен, должен ли я нормализовать компонент глубины или нет), но это не единственная проблема. Если вы посмотрите на конечный результат:

Существует проблема с компонентом горизонтальной косы. Поскольку каждый тексель представляет воксель, цвет куба всегда должен быть фиксированного цвета. Но, как вы видите, я получаю несколько цветов для одного куба на верхних гранях. Так что мой горизонтальный масштаб неверен.

Что я делаю неправильно, выбирая тексели из текстуры?

0 ответов

Другие вопросы по тегам