2015-09-13 3 views
0

Перед тем, как внедрить шейдерный куб, я попытался сделать skybox вручную с шестью текстурами вокруг него, но во время вращения я получаю искажение.OpenGL Почему карта куба деформируется во время просмотра?

В GL 3.3 с использованием униформы формы куба, есть ли какая-то добавленная математическая магия за кулисами (которая противодействует искажению), против создания шести плоских лиц и нанесения текстуры на каждую сторону вручную?

Пример
Это skymap с использованием шести отдельных текстур. Вы можете увидеть искажение в кубе угла, как сцена вращается frame 1 frame 2 frame 3

ответ

0

После настройки его на приложение для 3D-моделирования и проведения некоторых экспериментов, я чувствую, что могу ответить на мой собственный вопрос.

Cubemaps работает ТОЛЬКО с перспективой первого лица. Важно, чтобы глаз/камера сидела ровно в центре куба, а цель камеры вращается вокруг. Например: Eye at center

В обратном случае, когда цель находится точно в центре и глазных орбит вокруг него (например, в приложении 3D моделирования), то cubemap становится бесполезным искажением. Например: target at center

Итак ... чтобы ответить на этот вопрос. Нет, нет никакой магии по сравнению с GLSL cubemapping, из-за чего происходит искажение. Все дело в том, как приложение обрабатывает свою систему камеры.

+0

Ну, это отчасти верно. Главное здесь, что грани куба должны концептуально лежать на бесконечном расстоянии. Тогда движение камеры не имеет значения. Однако с программируемым конвейером все становится намного проще. Все, что нужно сделать в настоящее время, - это рисовать полноэкранный квадрат и использовать вектор направления из положения камеры для каждого фрагмента в виде куб-карт tex-коордов, что точно влияет на выборку карты куба, как если бы она была на бесконечности, как описано [здесь] (http://stackoverflow.com/questions/30015940/why-dont-people-use-tetrahedrons-for-skyboxes/30038392#30038392). – derhass

0

Конечно, карты куба может быть создана только с 90 ° FOV (по крайней мере, если камера расположена в центре кубы) , В противном случае вы не получите куб. Если вы уменьшите fov, вы получите пустое пространство вокруг краев. Если вы увеличите его, вы получите перекрывающиеся области. Вы могли бы также создать кубоид с не-90 ° fovs, но это не стоило бы усилий.

Режим адресации кубических карт в OpenGL отличается от режима адресации, используемого для обычных 2D-текстур. Вы получаете доступ к 2D текстурам с координатой 2D-текстуры. Доступ к картам Куба осуществляется через вектор трехмерного направления. Затем OpenGL использует этот вектор направления для вычисления используемой субструктуры и координаты текстуры для этой субструктуры.

Skybox также может быть легко реализован с использованием шести простых текстур. Фактически, режим расширенной адресации может даже оказаться недостатком в этом случае. Было бы иначе, если бы вы использовали другой объект несущей небо (например, я когда-то использовал sky tetrahedron). Если были искажения, в вашем коде должны были быть ошибки. Основной принцип работает.

 Смежные вопросы

  • Нет связанных вопросов^_^