Что означает координата 1/w в gl_FragCoord?

В переменной gl_FragCoord хранятся четыре компонента: (x, y, z, 1/w)

Что такое координата w и почему она хранится как 1/w?


person Fabian    schedule 30.04.2012    source источник


Ответы (2)


В этом отношении спецификации GLSL и OpenGL бесполезно запутывают. Спецификацию OpenGL легче понять: gl_FragCoord хранит компоненты X, Y и Z позиции вершины в пространстве окна. Значения X, Y и Z рассчитываются, как описано для вычисления положения в пространстве окна (хотя центр пикселя и начальная точка в верхнем левом углу могут изменять значения X и Y). Это описано в разделе Coordinate Transforms спецификации.

W-компонент gl_FragCoord равен (1 / Wc), где Wc – это положение вершины clip-space. Это gl_Position.w из вашего вершинного шейдера.

Единственная полезная цель сохранения Wc — это обратное преобразование gl_FragCoord для получения клипа. -пространственное положение назад. Что, как показано на этой странице, требует умножения на Wc. Но так как gl_FragCoord хранит только инверсию этого значения, теперь требуется разделить на gl_FragCoord.w.

Следовательно, мы можем предположить, что OpenGL хранит его таким образом, потому что OpenGL не может иметь слишком много смысла ;) Видите ли, существует правило, согласно которому каждая часть спецификации OpenGL должна содержать что-то немного бессмысленное. Компоненты XYZ имели слишком много смысла, поэтому они решили хранить в них значение, обратное тому, которое вам действительно нужно.

Хорошо, технически это исторический артефакт тех дней, когда 3D Labs создала GLSL. Я уверен, что они сделали это исключительно из эгоистичных аппаратных соображений, но у меня нет реальных доказательств этого.

person Nicol Bolas    schedule 30.04.2012

Однородная координата задается как: (x, y, z, w), которая проецируется на: (x/w, y/w, z/w). gl_FragCoord сохраняет эту проекцию, но вместо того, чтобы сохранять (бесполезно) (w/w) = (1) для последнего компонента, он сохраняет (1/w), чтобы сохранить полезную информацию.

person Brett Hale    schedule 30.04.2012
comment
gl_FragCoord хранит эту проекцию Нет, она хранит пост-проекционное преобразование этой проекции в пространство окна. - person Nicol Bolas; 01.05.2012