В glsl, какая формула используется для вычисления gl_fragCoord из gl_position? - PullRequest
7 голосов
/ 23 августа 2011

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

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

1 Ответ

10 голосов
/ 23 августа 2011

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

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

Операции, которые выполняются между ними:

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

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

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

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

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

...