2013-10-24 2 views
4

Мне нужно удалить все нечетные строки из текстуры - это часть простого деинтерлейсера.Как определить четную/нечетную линию текстуры в GLSL ES

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

_texcoord передается из вершинного шейдера и имеет диапазон [0, 1] для обоих х и у

uniform sampler2D sampler0; /* not used here because we directly output White or Red color */ 
varying highp vec2 _texcoord; 
void main() { 
    highp float height = 480.0; /* assume texture has height of 480 */ 
    highp float y = height * _texcoord.y; 
    if (mod(y, 2.0) >= 1.0) { 
     gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
    } else { 
     gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); 
    } 
} 

При визуализации на экране, выход не ожидается. Вертикально это RRWWWRRWWW Но я действительно ожидал RWRWRWRW (то есть альтернативный между красным и белым цветом)

Мой код работать на прошивкой и цели до GLES 2.0, так что не должно быть ничем не отличается от Android с GLES 2.0

Вопрос: Где я сделал не так?

EDIT

  1. Да высота текстуры правильно
  2. Я думаю, мой вопрос: дается _texcoord.y, как сказать, если он имеет в виду нечетной или даже линии текстуры.
+0

Убедитесь, что высота текстуры 480 – Max

+1

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

+0

Как отключить интерполированную выборку и использовать целочисленный доступ к текстуре? GL_TEXTURE_RECTANGLE недоступно в GLES –

ответ

3
void main(void) 
{ 
    vec2 p= vec2(floor(gl_FragCoord.x), floor(gl_FragCoord.y)); 
    if (mod(p.y, 2.0)==0.0) 
     gl_FragColor = vec4(texture2D(tex,uv).xyz ,1.0); 
    else 
     gl_FragColor = vec4(0.0,0.0,0.0 ,1.0); 
} 
Смежные вопросы