Как рассчитать GL FragCoord в glsl
Ok, в моем шейдере фрагментов 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
?
4 ответов
gl_FragCoord-это координаты экрана, поэтому вам нужно иметь информацию о размере экрана и таких, чтобы создать его на основе позиции. Fake_frag_coord, который вы создали, будет соответствовать точке на экране в нормализованных координатах устройства, я думаю (от -1 до 1). Поэтому, если вы умножите размер экрана на половину в определенном измерении, а затем добавите этот размер, вы получите фактические пиксели экрана.
проблема заключается в том, что gl_modelviewprojectionmatrix * gl_Vertex, вычисленный в шейдере, не всегда дает конвейер фиксированных функций. Чтобы получить идентичные результаты, выполните fake_frag_coord = ftransform ().
Edit:
а затем масштабировать его с размерами экрана.
хотел бы я иметь больше репутации, чтобы я тоже мог придираться. Вот что я знаю. В OpenGL выполняет деление на ж автоматически для вас, так что к тому времени положение прибывает в фрагментного шейдера, это уже в НДЦ координаты, и к тому ж будет 1.0, только время нужно разделить на W, если вы хотите, чтобы сделать ту же математику на ЦП стороны, и получить те же результаты, или, если вы по какой-то причине, хотел сделать НДЦ координаты внутри вершинного шейдера.
varying vec2 fake_frag_coord;
//in vertex shader:
fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy