Estoy tratando de aprender Shaders para implementar algo en mi aplicación de iPhone. Hasta ahora he entendido ejemplos fáciles como hacer una imagen a escala de grises, umbralización, etc. La mayoría de los ejemplos involucran operaciones simples en donde el procesamiento de la imagen de entrada píxel I(x,y)
resulta en una simple modificación de los colores del mismo píxelFiltro gaussiano con OpenGL Shaders
Pero, ¿qué hay de las circunvoluciones ?. Por ejemplo, el ejemplo más fácil sería el filtro gaussiano,
en donde la imagen de salida pixel O(x,y)
depende no sólo de I(x,y)
sino también en circundante 8 píxeles.
O(x,y) = (I(x,y)+ surrounding 8 pixels values)/9;
Normalmente, esto no se puede hacer con un único buffer de imagen o de entrada pixeles cambiará a medida que se realiza el filtro. ¿Cómo puedo hacer esto con sombreadores? Además, ¿debería manejar las fronteras yo mismo? o hay una función incorporada o algo que verifica el acceso a píxeles no válidos como I(-1,-1)
?
Gracias de antemano
PD: Voy a ser generoso (es decir: dar un montón de puntos);)
Usar la ventaja de la interpolación lineal no es tan nuevo. ¿Dónde está el beneficio de la forma más fácil? Buscar coordenadas [-4, -2, 0, 2, 4] para obtener un rango de 10 píxeles y luego aplicar la ponderación de cada dos téxeles? – djmj
@djmj - No estoy seguro de que te sigo. ¿A qué manera más fácil te refieres? ¿Cuáles son los dos téxeles a los que te refieres? ¿Tiene una referencia que puede señalar que describe este enfoque? –
Ver: http://drilian.com/journal/images/TextureGrid.png. Si toma muestras en (2, 0.5) obtendrá el valor interpolado bilineal de píxel (1, 0) y (2, 0). Muestreo en (2, 1) obtendrá el valor promedio de los 4 píxeles vecinos.Entonces use una compensación de 2 píxeles y luego aplique la ponderación gaussiana. – djmj