В переменной gl_FragCoord хранятся четыре компонента: (x, y, z, 1/w)
Что такое координата w и почему она хранится как 1/w?
В переменной gl_FragCoord хранятся четыре компонента: (x, y, z, 1/w)
Что такое координата w и почему она хранится как 1/w?
В этом отношении спецификации 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. Я уверен, что они сделали это исключительно из эгоистичных аппаратных соображений, но у меня нет реальных доказательств этого.
Однородная координата задается как: (x, y, z, w), которая проецируется на: (x/w, y/w, z/w). gl_FragCoord
сохраняет эту проекцию, но вместо того, чтобы сохранять (бесполезно) (w/w) = (1) для последнего компонента, он сохраняет (1/w), чтобы сохранить полезную информацию.
gl_FragCoord
хранит эту проекцию Нет, она хранит пост-проекционное преобразование этой проекции в пространство окна.
- person Nicol Bolas; 01.05.2012