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