tag manager descargar opengl glsl

opengl - manager - ¿Cómo obtener información de píxeles dentro de un sombreador de fragmentos?



pixel shader 5.0 descargar (2)

En mi sombreador de fragmentos puedo cargar una textura, y luego hacer esto:

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

Eso establece el píxel actual al valor de 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 valores de un píxel vecino?

Intenté esto:

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

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


¿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 todavía no son píxeles. De hecho, no solo nunca pueden convertirse en píxeles (a través de pruebas de discard o de profundidad, o lo que sea), gracias a la multimuestreo, los múltiples fragmentos pueden combinarse para formar un solo píxel.

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 está hablando del píxel del framebuffer vecino, no es así . Los sombreadores de fragmentos no pueden leer de forma arbitraria desde el framebuffer, ni en su propia posición ni en una adyacente.

Si estás hablando de acceder a un texel vecino del que accediste , entonces es solo cuestión de sesgar la coordenada de textura que pasas 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 .


Pan comido.

Simplemente calcule el tamaño de un píxel en función de 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