В OpenGL ES 2.0, Как читать соседние тексели из сэмплера? - PullRequest
11 голосов
/ 15 октября 2011

Я передаю текстуру с размером 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?

Ответы [ 2 ]

14 голосов
/ 15 октября 2011

Нем верно в своем ответе, что координата текстуры должна быть в [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), чтобы предотвратить деление в шейдере.

4 голосов
/ 15 октября 2011

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

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

...