2012-03-19 7 views
22

En mi fragmento shader puedo cargar una textura, y luego hacer esto:¿Cómo obtener información de píxeles dentro de un sombreador de fragmentos?

uniform sampler2D tex; 

void main(void) { 
    vec4 color = texture2D(tex, gl_TexCoord[0].st); 
    gl_FragColor = color; 
} 

que establece el píxel actual con el valor del color de la textura. Puedo modificar estos, etc. y funciona bien.

Pero algunas preguntas. ¿Cómo le digo a "qué" píxel soy? Por ejemplo, supongamos que quiero establecer el píxel 100,100 (x, y) en rojo. Todo lo demás a negro. ¿Cómo hago un:

"if currentSelf.Position() == (100,100); then color = red; else color = black?"

?

Sé cómo configurar los colores, pero ¿cómo obtengo "mi" ubicación?

En segundo lugar, ¿cómo obtengo los valores de un píxel vecino?

yo probamos este:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st); 

Pero no está claro qué se está volviendo? si soy pixel 100,100; ¿cómo obtengo los valores de 101,100 o 100,101?

Respuesta

28

¿Cómo le digo a "qué" píxel soy?

No eres un pixel. Eres un fragmento. Hay una razón por la que OpenGL los llama "sombreadores de fragmentos"; es porque no son píxeles pero. De hecho, no solo nunca pueden convertirse en píxeles (a través de discard o pruebas de profundidad o lo que sea), gracias a la multimuestreo, se pueden combinar múltiples fragmentos para formar un único píxeles.

Si desea saber dónde se encuentra su sombreador de fragmentos en el espacio de la ventana, use gl_FragCoord. Las posiciones de los fragmentos son valores de punto flotante, no enteros, por lo que debe probar con un rango en lugar de un único valor de "100, 100".

En segundo lugar, ¿cómo obtengo valores de un píxel vecino?

Si estamos hablando acerca del píxel vecino uso de este dispositivo, que no hace . Los sombreadores de fragmentos no pueden leer de forma arbitraria desde el framebuffer, ni en su propia posición ni en una adyacente.

Si estamos hablando acerca del acceso a un vecino Texel a la que ha accedido, entonces eso es sólo una cuestión de sesgar el de coordenadas de textura se pasa a texture2D. Debes obtener el tamaño de la textura (ya que no estás usando GLSL 1.30 o superior, tienes que pasar esto manualmente), invierte el tamaño y agrega o resta estos tamaños del componente S y T de la coordenada de textura .

+1

me adelantó; todo lo que tenía que decir que difiere, incluso ligeramente, de este fue el enlace http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml que entra un poco más en detalle sobre 'gl_FragCoord' y la recomendación de un procesamiento intermedio para texturar si realmente quiere calcular fragmentos de salida basados ​​en la combinación de múltiples píxeles vecinos en lo que de otro modo sería el buffer de salida. – Tommy

+0

Básicamente lo que quiero hacer es si el pixel x, y tiene vecinos con rojo en ellos, para aumentar el rojo en x, y. ¿Hay algún tutorial que explique cómo hacer esto? – user697111

+2

@ user697111: Desea implementar un filtro de "dilatación" que trabaje en el canal rojo de una textura. Google esas palabras clave y debe encontrar mucho. – datenwolf

0

Easy peasy.

Simplemente calcule el tamaño de un píxel según la resolución. Luego busca +1 y -1.

vec2 onePixel = vec2(1.0, 1.0)/u_textureSize; 
gl_FragColor = (
    texture2D(u_image, v_texCoord) + 
    texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) + 
    texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0)))/3.0; 

Hay un buen ejemplo here

Cuestiones relacionadas