2013-07-15 3 views
2

Чтобы улучшить свое понимание 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, но я не смог найти документацию, которая поддерживает это.

ответ

3

Clip-Space в OpenGL уже левша (и всегда был). Таким образом, в современном GL нет пространства, явно использующего правостороннюю систему, и вообще нет «переворачивания». Однако пространство глаз в старом ГЛ часто определялось как правое, а «переворачивание» выполнялось как часть матрицы проекции, glFrustum() и gluPerpective() явно ожидали положительных значений для близких и дальних ссылок на значения отрицательных отрицательных значений z. Однако, поскольку вы можете использовать произвольные матрицы, вы никогда не были вынуждены определять ваши глаза или пространства объектов правыми, это было просто что-то вроде соглашения по умолчанию. И все же многие люди следуют этому соглашению с программируемым конвейером.

+0

Это многое объясняет. Однако это не объясняет, почему [моя небольшая примерная программа] (https://github.com/rasmusrn/webgl_triangles) предлагает противоположное. В принципе, я настраиваю два треугольника, а затем проталкиваю их через самые простые шейдеры, о которых я мог думать. Если место для клипа осталось слева, я бы ожидал, что треугольник с наивысшей координатой z выйдет сверху, но это не так. Мяч программы находится в ['app.js'] (https://github.com/rasmusrn/webgl_triangles/blob/master/javascript/app.js). Это должно быть довольно легко читать. Почему зеленый треугольник поверх другого? –

+0

@ RasmusRønnNielsen: подумайте об этом. i - левая система, z указывает от вас, поэтому поцелуй с самым низким значением z будет сверху. Если мы игнорируем перспективу и компонент w на мгновение (как это делает ваш код), пространство клипа идентично нормализованному пространству устройства, а при z = -1 лежит ближняя плоскость (фронт усечения), а при z = 1 лежит далеко (назад), так что все хорошо, не так ли? – derhass

+0

@ RasmusRønnNielsen: также, я не проверял, как и как вы настроили 'DEPTH_TEST' в своем коде. Таким образом, порядок рисования может полностью определить, что выходит сверху, если тест отключен. В противном случае, предполагая установку теста глубины станарды, зеленый треугольник (z = -0,9) должен быть сверху красного (z = 0). – derhass

0

Согласно Руководство для начинающих WebGL, ось z инвертируется во время деления перспективы, которое выполняется после преобразования проекции.

Вот что он говорит:

Перспективное деление превращает видимое пространство в кубу с центром в начале координат с минимальными координатами [-1, -1, -1] и максимальных координат [1 1,1]. Кроме того, направление оси инвертируется, так как показано на следующем рисунке:

enter image description here

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

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