В OpenGL ES 2.0, как читать соседние тексели из Sampler?

Я передаю текстуру с размером NxM в качестве семплера в шейдере фрагмента GLSL (OpenGL ES 2.0). Каков правильный способ чтения данных текселя из соседнего текселя? У меня нет "изменяющейся" координаты текстуры в шейдере фрагментов. Я могу использовать только координату фрагмента, чтобы читать информацию о текстуре.

Следующее - это мой шейдер, я не уверен, действительно ли он считывает данные:

precision mediump float;

uniform sampler2D Sampler;

#define OFFSET 1.0

void main()
{

    vec2 T = gl_FragCoord.xy;

    //Find neighboring velocities:
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+OFFSET)).xy;
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-OFFSET)).xy;
    vec2 E = texture2D(Sampler,vec2(T.x+OFFSET,T.y)).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-OFFSET,T.y)).xy; 
}

Является ли значение OFFSET равным 1.0 или что-то еще для текстуры размера NxM?

Ответ 1

Нем прав в своем ответе, что координата текстуры должна быть в [0,1]. Но имейте в виду, что значения gl_FragCoord находятся в [0, N] x [0, M] (при условии, что ваше окно просмотра равно NxM). Таким образом, вы правильно добавили смещение 1 к координате фрагмента, но затем эту сумму нужно разделить на размер экрана (что, вероятно, совпадает с размером текстуры):

precision mediump float;

uniform sampler2D Sampler;
uniform vec2 invScreenSize;

void main()
{

    vec2 T = gl_FragCoord.xy;

    //Find neighboring velocities:
    vec2 N = texture2D(Sampler,vec2(T.x,T.y+1.0)*invScreenSize).xy;
    vec2 S = texture2D(Sampler,vec2(T.x,T.y-1.0)*invScreenSize).xy;
    vec2 E = texture2D(Sampler,vec2(T.x+1.0,T.y)*invScreenSize).xy; 
    vec2 W = texture2D(Sampler,vec2(T.x-1.0,T.y)*invScreenSize).xy; 
}

где invScreenSize - это обратный размер экрана (1/N, 1/M), чтобы предотвратить деление в шейдере.

Ответ 2

Я уверен, что в OpenGL ES 2.0 все координаты текстуры будут плавать между 0.0 и 1.0, поэтому добавление 1.0 будет неправильным и, вероятно, просто обернется к тому же самому положению. Ваше смещение x должно быть 1,0/N, а ваше смещение y должно быть 1,0/M (на основе вашего оператора NxM). Я не уверен, что это лучшее решение, но я использовал его для решения аналогичной проблемы.

Я бы посоветовал вам проверить спецификацию языка Shading Language OpenGL ES, чтобы убедиться, что мои требования относительно формата координат текстур верны (я сделал это несколько месяцев назад). Это pdf-документ, который легко найти с помощью google и имеет удобный список всех встроенных функций.