Как вычислить 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