Когда координата Z нормализована в GLSL?

Я думал, что всякий раз, когда вы трансформируете объект в мировое пространство, затем просматриваете пространство и, наконец, пространство экрана, последняя применяемая матрица (матрица проецирования) нормализует значения z между 0 и 1.

Однако я получаю большие координаты z, что означает, что матрица проекции не нормализует его. Я делаю что-то неправильно? Я имею в виду, что все, что я делаю, это:

gl_Position = projection * view * world * gl_Vertex;
5 голосов | спросил Kipras 20 32013vEurope/Moscow11bEurope/MoscowWed, 20 Nov 2013 21:33:16 +0400 2013, 21:33:16

2 ответа


12

Вам не хватает нескольких ключевых моментов .

После применения матрицы проекции у вас есть 4-компонентный вектор в пространстве клипа (не экранное пространство), который является однородной системой координат, в которой будет выполняться обрезка (после вашей вершины шейдер).

После отсечения оставшиеся координаты делятся на компонент w, чтобы получить нормализованные координаты устройства в (-1, 1). Затем будет применено преобразование для перехода от пространства NDC к координатам окна, где координаты X и Y нормализуются на основе , отображаемый в OpenGL , и координата Z нормализована на основе глубины диапазон , что в конечном итоге дает вам (0, 1) диапазон для глубины (если вы не используете glDepthRange, чтобы установить различный диапазон).

Если вы хотите получить доступ к этому нормализованному значению Z в своем вершинном шейдере, вам нужно будет выполнить вычисление вручную в шейдере (на основе информации выше).

ответил Josh 20 32013vEurope/Moscow11bEurope/MoscowWed, 20 Nov 2013 21:48:54 +0400 2013, 21:48:54
2

Умножение вершинной позиции по матрице мира, представления и проекции создает положение в однородных координатах, т. е. (x, y, z, w). Только после деления на w значения xyz между -1 и 1 (примечание: не от 0 до 1).

Если вы не знакомы с однородными координатами, см. другие вопросы на этом сайте: Что делает графическая карта с четвертым элементом вектора? и Мне нужен компонент w в классе Vector?

ответил Nathan Reed 20 32013vEurope/Moscow11bEurope/MoscowWed, 20 Nov 2013 21:49:12 +0400 2013, 21:49:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132