Чтобы улучшить свое понимание OpenGL и 3D, я пытаюсь реализовать простой конвейер рендеринга, работающий только на процессоре. Где это имеет смысл, я пытаюсь использовать те же стандарты, что и OpenGL. Например, я использую правую систему координат like OpenGL. Как это часто бывает при изучении чего-то нового, у меня теперь возникает вопрос, на который я не могу найти ответ. Если что-то в следующем не имеет смысла, пожалуйста, простите меня и исправьте.Когда ось Z перевернута? (OpenGL)
В пространстве клипа (координата, которую вы указываете gl_Position
в вашем вершинном шейдере), отрицательный Z находится вдали от пользователя. Но в буфере глубины положительный Z находится далеко (если вы используете настройки глубины по умолчанию).
Один ответ на вопрос this question предполагает, что флип обусловлен преобразованием проекции. Но я сделал a little experiment (основанный на WebGL/OpenGL ES), который предлагает противоположное: в пространстве клипов Z указывает от пользователя, даже если вы не используете преобразование проекции.
Итак, в какой-то момент, после того, как вы передали его gl_Position
, OpenGL переворачивает координату Z. Когда и как это?
Я предполагаю, что он находится в viewport transform, но я не смог найти документацию, которая поддерживает это.
Это многое объясняет. Однако это не объясняет, почему [моя небольшая примерная программа] (https://github.com/rasmusrn/webgl_triangles) предлагает противоположное. В принципе, я настраиваю два треугольника, а затем проталкиваю их через самые простые шейдеры, о которых я мог думать. Если место для клипа осталось слева, я бы ожидал, что треугольник с наивысшей координатой z выйдет сверху, но это не так. Мяч программы находится в ['app.js'] (https://github.com/rasmusrn/webgl_triangles/blob/master/javascript/app.js). Это должно быть довольно легко читать. Почему зеленый треугольник поверх другого? –
@ RasmusRønnNielsen: подумайте об этом. i - левая система, z указывает от вас, поэтому поцелуй с самым низким значением z будет сверху. Если мы игнорируем перспективу и компонент w на мгновение (как это делает ваш код), пространство клипа идентично нормализованному пространству устройства, а при z = -1 лежит ближняя плоскость (фронт усечения), а при z = 1 лежит далеко (назад), так что все хорошо, не так ли? – derhass
@ RasmusRønnNielsen: также, я не проверял, как и как вы настроили 'DEPTH_TEST' в своем коде. Таким образом, порядок рисования может полностью определить, что выходит сверху, если тест отключен. В противном случае, предполагая установку теста глубины станарды, зеленый треугольник (z = -0,9) должен быть сверху красного (z = 0). – derhass