Какая формула используется в glsl для вычисления gl_fragCoord из gl_position?

Пожалуйста, поправьте меня, если я ошибаюсь. При использовании вершинных и пиксельных шейдеров мы обычно предоставляем код для вычисления выходного gl_position вершинного шейдера. Затем мы оказываемся со входным параметром gl_FragCoord в пиксельном шейдере. Как называются операции, выполняемые OpenGL для вычисления gl_FragCoord из gl_position? Верно ли, что это «проекция» и «преобразование координат клипа»? Тогда какие именно преобразования выполняются во время этих операций? Другими словами, какова математическая связь между gl_FragCoord и gl_position, которую я мог бы использовать для замены функции openGL?

Большое спасибо за любой вклад.


person wip    schedule 23.08.2011    source источник
comment
Некоторое время назад у меня была такая же проблема и вопрос, и я сам ответил на него в вопросе OpenGL: вычислить координату пространства глаза из координаты пространства окна в GLSL ?, ссылку на который вы можете найти справа.   -  person Razzupaltuff    schedule 23.08.2011
comment
Извините, karx11erx, это не то, что я хочу. На самом деле, я думаю, что хочу наоборот. Я не хочу отменять проекцию, я хочу проецировать свои 3D-координаты на 2D-координаты экрана.   -  person wip    schedule 04.09.2011
comment
Вы также можете увидеть, как это сделать, потому что шейдер сначала отменяет проецирование (из пространства просмотра света), а затем проецирует (в пространство экрана зрителя).   -  person Razzupaltuff    schedule 05.09.2011


Ответы (1)


gl_Position находится в однородных координатах после проекции.

Стоит отметить, что gl_Position - это (4d) позиция вершины, а gl_FragCoord - (2d) позиция фрагмента.

Промежуточные операции:

  1. примитивная сборка (например, для создания треугольника из 3-х вершин)
  2. обрезка (т.е. разрезать треугольник на несколько треугольников, которые находятся внутри вида, если он изначально не помещается)
  3. приложение области просмотра
  4. растеризация (возьмите эти треугольники и сгенерируйте из них закрытые фрагменты)

Итак, хотя вы можете найти формулу для преобразования произвольной точки, которая представлена ​​из положения вершины в 2-м пространстве, которое является окном просмотра, она сама по себе не полезна, поскольку сгенерированные фрагменты не выравниваются непосредственно по положению вершины. . формула для получения 2-й координаты вершины:

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy / gl_Position.w)/2

Опять же, это не gl_FragCoord. Если вам нужны более глубокие знания, ознакомьтесь с подробностями о растеризации в спецификации GL.

Я не совсем уверен, что вы имеете в виду под «заменой функции openGL», но растеризация нетривиальна и выходит за рамки ответа SO.

person Bahbar    schedule 23.08.2011
comment
Спасибо за ваш ответ. Моя цель - реализовать шейдер освещения карты теней. Я создал карту глубины (карту теней) путем рендеринга сцены из положения источника света (используя матрицу проекции света), однако при рендеринге вершин финальной сцены я не знаю, какие координаты использовать для извлечения данных тени с карты. Я думал, что могу использовать матрицу проекции света, чтобы получить значение, которое было gl_position, когда я создавал карту теней, а затем вычислить значение, которое было gl_fragCoord, когда я создал карту теней, чтобы получить данные тени в правильном положении. Может это сработает? - person wip; 23.08.2011
comment
@wil: типичный способ сделать это - передать положение в пространстве или пространстве просмотра вместе с gl_Position (в другом выводе) во фрагментный шейдер. Таким образом, во фрагментном шейдере правильная интерполированная позиция (в представлении или в мировом пространстве, в зависимости от того, что вы передали) может быть преобразована матрицей, чтобы вернуть ее в светлое пространство. Короткий ответ: не полагайтесь на gl_FragCoord, передавайте то, что вам нужно. - person Bahbar; 23.08.2011
comment
Я не совсем уверен, что вам нужно, но это не похоже на вычисление карты теней. Это то, о чем я имел в виду, и звучит значительно иначе, чем вы. Я бы порекомендовал открыть новый вопрос с некоторым пониманием того, что вы пытаетесь решить. - person Bahbar; 17.09.2012