GLSL: проблемы с gl_FragCoord - PullRequest
9 голосов
/ 28 февраля 2011

Я экспериментирую с GLSL для OpenGL ES 2.0.У меня есть квад и текстура, которую я рендеринг.Я могу успешно сделать это следующим образом:

//VERTEX SHADER
attribute highp vec4 vertex;
attribute mediump vec2 coord0;

uniform mediump mat4 worldViewProjection;

varying mediump vec2 tc0;

void main()
{
    // Transforming The Vertex
    gl_Position = worldViewProjection * vertex;

    // Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader
    tc0 = vec2(coord0);
}

//FRAGMENT SHADER
varying mediump vec2 tc0;

uniform sampler2D my_color_texture;

void main()
{
    gl_FragColor = texture2D(my_color_texture, tc0);
}

Пока все хорошо.Тем не менее, я бы хотел сделать фильтрацию на основе пикселей, например, Median.Итак, я хотел бы работать в пиксельных координатах, а не в нормализованных (tc0), а затем преобразовать результат обратно в нормализованные координаты.Поэтому я хотел бы использовать gl_FragCoord вместо атрибута uv (tc0).Но я не знаю, как вернуться к нормализованным координатам, потому что я не знаю диапазон gl_FragCoords.Любая идея, как я мог получить это?Я дошел до этого, используя фиксированное значение для «нормализации», хотя оно не работает идеально, поскольку вызывает растяжение и мозаику (но, по крайней мере, что-то показывает):

//FRAGMENT SHADER
varying mediump vec2 tc0;

uniform sampler2D my_color_texture;

void main()
{
    gl_FragColor = texture2D(my_color_texture, vec2(gl_FragCoord) / vec2(256, 256));
}

Итак, простой вопросявляется то, что я должен использовать вместо vec2(256, 256), чтобы я мог получить тот же результат, как если бы я использовал UV-координаты.

Спасибо!

Ответы [ 2 ]

18 голосов
/ 28 февраля 2011

gl_FragCoord находится в экранных координатах, поэтому для получения нормализованных координат вам нужно разделить их на ширину и высоту области просмотра.Вы можете использовать универсальную переменную для передачи этой информации шейдеру, поскольку для него нет встроенной переменной.

3 голосов
/ 28 февраля 2011

Вы также можете выбрать текстуру по ненормализованным координатам, если:

  • выборка по текстуре () из GL_TEXTURE_RECTANGLE
  • выборка по texelFetch () из обычного буфера текстуры или текстуры
...