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!
¡Gracias! Umm, ¿podría obtener el tamaño de la ventana gráfica desde el sombreador? –
@Albus No, como he dicho, la única forma es pasarlo manualmente a través de una variable uniforme. –
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. :-) –