Как работает система координат для 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 может быть совершенно неправильной (я не уверен, должен ли я нормализовать компонент глубины или нет), но это не единственная проблема. Если вы посмотрите на конечный результат:
Существует проблема с компонентом горизонтальной косы. Поскольку каждый тексель представляет воксель, цвет куба всегда должен быть фиксированного цвета. Но, как вы видите, я получаю несколько цветов для одного куба на верхних гранях. Так что мой горизонтальный масштаб неверен.
Что я делаю неправильно, выбирая тексели из текстуры?