Как вычислить gl_FragCoord в glsl

Хорошо, в моем шейдере фрагмента GLSL я хочу иметь возможность рассчитать расстояние фрагмента от конкретной строки в пространстве.

В результате я сначала пытаюсь использовать переменный набор vec2 в моем вершинном шейдере, чтобы отразить то, что заканчивается в gl_FragCoord:

varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;

Теперь в шейдере фрагмента я ожидаю:

gl_FragCoord.xy==fake_frag_coord

Но это не так. Какую операцию выполняет трубопровод на gl_Position, чтобы превратить его в gl_FragCoord, на который я пренебрегаю делать на fake_frag_coord?

Ответы

Ответ 1

gl_FragCoord - это координаты экрана, поэтому вам нужно будет иметь информацию о размере экрана и т.д., чтобы создать его на основе позиции. Я думаю, что созданный fake_frag_coord будет соответствовать точке на экране в нормализованных координатах устройства (от -1 до 1). Поэтому, если вы должны умножить на половину размера экрана в определенном измерении, а затем добавить этот размер, вы получите фактические пиксели экрана.

Ответ 2

Проблема заключается в том, что gl_ModelViewProjectionMatrix * gl_Vertex, вычисленный в шейдере, не всегда соответствует конвейеру с фиксированной функцией. Чтобы получить одинаковые результаты, сделайте fake_frag_coord = ftransform().

Edit:

И затем масштабируйте его с помощью размеров экрана.

Ответ 3

Хотелось бы, чтобы у меня было больше репутации, поэтому я тоже мог поддразнивать. Вот что я знаю. OpenGL автоматически выполняет Divide-By-W для вас, поэтому к тому моменту, когда позиция поступает в шейдер фрагмента, она уже находится в координатах NDC, а к тому времени W будет 1.0, единственный раз, когда вам нужно разделить W, - если вы хотите сделать ту же математику на стороне процессора и получить те же результаты, ИЛИ, если вы по какой-то нечетной причине захотели получить координаты NDC в своем вершинном шейдере.

Ответ 4

varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy