В 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 и имеет удобный список всех встроенных функций.