NDC (Native Device Coordinates)

В данной статье речь пойдет о системе координат, использующейся при отображении трёхмерных объектов средствами графической библиотеки OpenGL.

Что такое NDC?

Определим систему координат с центром в точке O и ортонормированным базисом \{e_x, e_y, e_z\}, представляющим из себя левую тройку векторов.

Рассмотрим множество векторов v = (x, y, z) в базисе \{e_x, e_y, e_z\}, таких что -1 \leq x,y,z \leq 1. Будем считать, что точки, соответствующие данным векторам образуют видимое пространство, а любые другие точки не попадают в поле зрения.

Тогда видимое пространство представляет из себя куб с длиной ребра равной 2, а в центре данного куба расположено начало координат. Такую систему будем называть NDC.

Способ отображения

Поскольку всё, что мы способны увидеть, отображается на двумерной плоскости (экране монитора), то необходимо спроецировать точки видимого пространства на плоскость. В данном случае такой плоскостью является грань куба, проходящая через точку (0, 0, -1) в определенной выше системе координат.

NDC Cube
Видимое пространство и плоскость, на которую проецируются точки

Если представить, что выделенная грань — это поверхность экрана монитора, то ось x направлена вправо, ось y — вверх, а ось z — от нас в глубь экрана. Точка, соответствующая началу координат, будет спроецирована в центр экрана.

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

Projection in NDC

Это значит, что вид трехмерного обекта не меняется при перемещении этого объекта вдоль оси z. Расстояние от обекта до зрителя влияет только на порядок отображения обектов и их фрагментов. Например, если два фрагмента перекрывают друг-друга только по осям x и y, то на переднем плане окажется ближайший к зрителю фрагмент.

Клиппинговые координаты

Информация о вершинах 3D-объекта обрабатывается в рамках vertex-шейдера. Но выходная переменная gl_Position содержит не трёх-, а четырёхкомпонентрый вектор. Дело в том, что мы не работаем в системе координат NDC напрямую, а формируем своего рода «клиппинговые координаты», которые затем преобразуются в координаты NDC.

Пусть v_c = (x_c, y_c, z_c, w_c) — четырехкомпонентный вектор на выходе vertex-шейдера, тогда v = (\frac{x_c}{w_c}, \frac{y_c}{w_c}, \frac{z_c}{w_c}) — это соответствующий ему вектор в системе NDC. Не трудно видеть, что клиппинговые координаты будут соответствовать точке видимого пространства, если |x_c,y_c,z_c| \leq w_c.


Вывод

Любая видимая на экране монитора 3D-сцена — это результат проецирования точек пространства «единичного куба» на одну из граней этого куба путем проведения перпендикуляра к этой грани.

Если требуется отобразить сцену большего размера, чем «единичный куб», то её пространство следует привести к этому единичному кубу за счет выбора компонента w_c клиппинговых координат.

Графическая система не формирует сама по себе какой-либо способ отображения трёхмерного пространства (в виде перспективы или изометрии, например), она предоставляет возможность сформировать этот способ самим в рамках vertex-шейдера.

30

Добавить комментарий

Ваш e-mail не будет опубликован.