2011-02-28 17 views
9

Estoy experimentando con GLSL para OpenGL ES 2.0. Tengo un quad y una textura que estoy renderizando. Puedo hacerlo con éxito de esta manera:GLSL: problemas de gl_FragCoord

//VERTEX SHADER 
attribute highp vec4 vertex; 
attribute mediump vec2 coord0; 

uniform mediump mat4 worldViewProjection; 

varying mediump vec2 tc0; 

void main() 
{ 
    // Transforming The Vertex 
    gl_Position = worldViewProjection * vertex; 

    // Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader 
    tc0 = vec2(coord0); 
} 

//FRAGMENT SHADER 
varying mediump vec2 tc0; 

uniform sampler2D my_color_texture; 

void main() 
{ 
    gl_FragColor = texture2D(my_color_texture, tc0); 
} 

Hasta ahora todo bien. Sin embargo, me gustaría hacer algunos filtros basados ​​en píxeles, p. Mediana. Por lo tanto, me gustaría trabajar en coordenadas de píxeles en lugar de en normalizado (tc0) y luego convertir el resultado a coords normalizados. Por lo tanto, me gustaría usar gl_FragCoord en lugar de un atributo uv (tc0). Pero no sé cómo volver a los coords normalizados porque no conozco el rango de gl_FragCoords. ¿Alguna idea de cómo podría conseguirlo? He llegado tan lejos, utilizando un valor fijo para la 'normalización', a pesar de que no está funcionando perfectamente, ya que está causando el estiramiento y alicatados (pero al menos está mostrando algo):

//FRAGMENT SHADER 
varying mediump vec2 tc0; 

uniform sampler2D my_color_texture; 

void main() 
{ 
    gl_FragColor = texture2D(my_color_texture, vec2(gl_FragCoord)/vec2(256, 256)); 
} 

Por lo tanto, la simple pregunta es, ¿qué debo usar en el lugar de vec2(256, 256) para que pueda obtener el mismo resultado que si estuviera usando las coordenadas uv?

Gracias!

Respuesta

18

gl_FragCoord está en coordenadas de pantalla, por lo que para obtener coordenadas normalizadas debe dividir por el ancho y el alto de la ventana gráfica. Puede usar una variable uniforme para pasar esa información al sombreador, ya que no tiene una variable incorporada.

+0

¡Gracias! Umm, ¿podría obtener el tamaño de la ventana gráfica desde el sombreador? –

+2

@Albus No, como he dicho, la única forma es pasarlo manualmente a través de una variable uniforme. –

+0

Gracias. Si no es una molestia, ¿podría darme una idea de cómo pasar la variable desde fuera de mi sombreador? Verá, soy muy nuevo en OpenGL. :-) –

3

También puede probar la textura por coordenadas no normalizado si:

  • de muestreo por la textura() desde GL_TEXTURE_RECTANGLE
  • muestreo por texelFetch() desde un búfer de textura o la textura normal
+1

Gracias, pero ¿es válido en OpenGL ES 2.0? –

+0

@Albus Dumbledore. Lo sentimos, no se aplica a GL ES en absoluto. Mi respuesta es inútil para ti. – kvark

+0

Sin preocupaciones. Siempre es mejor saber más, incluso si no es exactamente lo que se estaba buscando. Gracias :-) –