2011-10-14 7 views
11

Estoy pasando una textura con el tamaño NxM como una muestra en el sombreador de fragmentos GLSL (OpenGL ES 2.0). ¿Cuál es la forma correcta de leer los datos de texel del texel vecino? No tengo una coordenada de textura "variable" en el sombreador de fragmentos. Solo puedo usar la coordenada de fragmento para leer la información de textura.En OpenGL ES 2.0, ¿cómo leer los texels vecinos de un Sampler?

siguiente es mi shader, no estoy seguro de si es en realidad la lectura de los datos:

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; 
} 

muestra el valor inicial debe ser de 1,0 o algo más de N x M textura tamaño?

+0

¿Qué estás tratando de hacer exactamente aquí? – IDWMaster

+0

@IDWMaster Supongo que accediendo a los valores de texel vecinos, como él dijo. No sé dónde hay algo poco claro o si importa lo que realmente quiere lograr al final. –

+0

Bienvenido a StackOverflow, espero que lea las [preguntas frecuentes] (http://stackoverflow.com/faq#howtoask). –

Respuesta

14

Nem tiene razón en su respuesta que la coordenada de la textura debe estar en [0,1]. Pero tenga en cuenta que los valores de gl_FragCoord están en [0, N] x [0, M] (suponiendo que su ventana gráfica también sea NxM). Por lo que son correctas en la adición de un desplazamiento de 1 al fragmento de coordenadas, pero esta suma tiene entonces que ser dividido por el tamaño de la pantalla (que es probablemente el mismo que el tamaño de la textura):

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; 
} 

donde invScreenSize es el tamaño de pantalla recíproca (1/N, 1/M), para evitar la división en el sombreador.

+0

Gracias a todos, funciona ahora. La especificación del lenguaje de sombreado de OpenGL ES no es muy clara en el uso de texture2D. – kal21

+1

@ kal21 De hecho, cualquier tutorial introductorio de OpenGL debería haberle dicho que se accede a las texturas mediante coordenadas de textura normalizadas en [0,1]. –

4

Estoy bastante seguro de que en OpenGL ES 2.0 todas las coordenadas de la textura son flotantes entre 0.0 y 1.0, por lo que agregar 1.0 será incorrecto, y probablemente se ajuste a la misma posición. Su desplazamiento x debe ser 1.0/N y su desplazamiento y debe ser 1.0/M (basado en su declaración NxM). No estoy seguro de que esta sea la mejor solución, pero la he usado para resolver un problema similar.

Le aconsejo que consulte la especificación del Lenguaje de sombreado de OpenGL ES para verificar que mi afirmación sobre el formato de coordenadas de la textura sea correcta (esto lo hice hace unos meses). Es un pdf que es fácil de encontrar con Google y tiene una lista conveniente de todas las funciones integradas en alguna parte.

Cuestiones relacionadas