Когда ось Z перевернута? (OpenGL)
Чтобы улучшить мое понимание OpenGL и 3D, я пытаюсь реализовать простой конвейер рендеринга, работающий только на процессоре. Где это имеет смысл, я пытаюсь использовать те же стандарты, что и OpenGL. Например, я использую правую систему координат, такую как OpenGL. Как это часто бывает при изучении чего-то нового, я столкнулся с вопросом, на который не могу найти ответ. Если что-то в следующем не имеет смысла, пожалуйста, прости и исправь меня.
В пространстве клипа (координата, которую вы даете gl_Position
в вашем вершинном шейдере), отрицательный Z находится в стороне от пользователя. Но в буфере глубины положительный Z отсутствует (если вы используете настройки глубины по умолчанию).
Один ответ на этот вопрос предполагает, что переворот происходит из-за преобразования проекции. Но я провел небольшой эксперимент (на основе WebGL/OpenGL ES), который предлагает обратное: в пространстве клипа Z указывает в сторону от пользователя, даже если вы не используете проекционное преобразование.
Так что в какой-то момент, после того как вы передали gl_Position
OpenGL переворачивает координату Z. Когда и как это?
Я предполагаю, что это в преобразовании области просмотра, но я не смог найти документацию, которая поддерживает это.
2 ответа
Clip-Space в OpenGL уже левша (и всегда был). Итак, в современном GL нет места явно использующему правую систему, и никакого "переворота" вообще не делается. Тем не менее, глазное пространство в старом GL часто определялось для правшей, и "переворачивание" выполнялось как часть проекционной матрицы, glFrustum()
а также gluPerpective()
явно ожидаем, что положительные значения для ближнего и дальнего относятся к репсективным отрицательным значениям z. Однако, поскольку вы могли использовать произвольные матрицы, вы никогда не были вынуждены определять пространство глаз или объектов справа, это было что-то вроде соглашения по умолчанию. И все же многие люди следуют этому соглашению с программируемым конвейером.
Согласно Руководству для начинающих WebGL, ось z инвертируется во время деления перспективы, которое выполняется после преобразования проекции.
Вот что это говорит:
Деление перспективы преобразует усеченный вид в куб с центром в начале координат с минимальными координатами [-1,-1,-1] и максимальными координатами [1,1,1]. Кроме того, направление оси z инвертировано, как показано на следующем рисунке: