Почему этот шейдер OpenGL использует координаты текстуры за пределами 1.0? - PullRequest
5 голосов
/ 18 июля 2011

Я пытаюсь познакомиться с шейдерами в opengl. Вот пример кода, который я нашел (работа с openframeworks). Код просто размывает изображение в два прохода, сначала по горизонтали, а затем по вертикали. Вот код из горизонтального шейдера. Мое единственное замешательство - координаты текстуры. Они превышают 1.

void main( void )
{
    vec2 st = gl_TexCoord[0].st;
    //horizontal blur
    //from http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/

    vec4 color;

    color += 1.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -4.0, 0));
    color += 2.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -3.0, 0));
    color += 3.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -2.0, 0));
    color += 4.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * -1.0, 0));

    color += 5.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt , 0));

    color += 4.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * 1.0, 0));
    color += 3.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * 2.0, 0));
    color += 2.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * 3.0, 0));
    color += 1.0 * texture2DRect(src_tex_unit0, st + vec2(blurAmnt * 4.0, 0));

    color /= 5.0;
    gl_FragColor = color;
}

Я не могу сделать из этого кода головы или хвосты. Координаты текстуры должны быть между 0 и 1, и я немного читал о том, что происходит, когда они больше 1, но это не то поведение, которое я вижу (или я не вижу связи). blurAmnt варьируется от 0,0 до 6,4, поэтому значение s может быть от 0 до 25,6. Изображение просто становится более или менее размытым в зависимости от значения, я не вижу повторяющихся узоров.

Мой вопрос сводится к следующему: что именно происходит, когда аргумент координаты текстуры в вызове texture2DRect превышает 1? И почему поведение размытия по-прежнему прекрасно работает, несмотря на это?

Ответы [ 2 ]

8 голосов
/ 18 июля 2011

Диапазон координат текстуры [0, 1] применяется только к цели текстуры GL_TEXTURE_2D.Поскольку этот код использует texture2DRect (и samplerRect), он использует текстурную цель GL_TEXTURE_RECTANGLE_ARB, что эта цель использует ненормализованные текстурные координаты , в диапазоне [0, ширина] x [0, высота].

Вот почему у вас "странные" текстурные координаты.Не волнуйтесь, они отлично работают с этой текстурой.

0 голосов
/ 18 июля 2011

Зависит от кода хоста.Если вы увидели что-то вроде

glTexParameteri (GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);

, то за пределами измерения будет нули, IIRC.Похоже на т.

...