2011-07-27 22 views
10

Quiero crear un efecto de desenfoque usando un sombreador de fragmentos en OpenGL ES 2.0. El algoritmo que me interesa es simplemente un desenfoque promedio: agregue todos los píxeles adyacentes y divídalos por 9 para normalizar.Crear un filtro de desenfoque con un sombreador: ¿tiene acceso a los píxeles adyacentes del sombreador de fragmentos?

Sin embargo tengo 2 problemas:

1) ¿Esto me requieren para prestar primeros a un uso de este dispositivo, a continuación, cambiar los objetivos de representación? ¿O hay una manera más fácil?

2) supongo que enlace mi imagen "fuente" para desenfocarla como textura 0, y estoy generando mi textura borrosa. ¿Cómo accedo a los píxeles que no son con los que estoy tratando actualmente? El vertder shader me ha invocado para pixel i, pero necesito acceder a los píxeles a mi alrededor. ¿Cómo? Y ¿cómo puedo saber si soy un caso extremo (literalmente al borde de la pantalla)

(3: ¿existe un algoritmo más adecuado para conseguir un borrón en busca de vidrio esmerilado difusa)

Respuesta

11

Abundando un poco más en lo que dijo Matias:

  1. Sí. Usted renderiza la imagen en una textura (mejor hecho usando FBO) y en el segundo pase (desenfoque) une esta textura y lee de ella. No puede realizar los pasos de renderizado y desenfoque en un solo paso, ya que no puede acceder al framebuffer en el que está renderizando actualmente. Esto introduciría dependencias de datos, ya que sus vecinos aún no necesitan tener su color final, o peor, el color depende de usted.

  2. Usted obtener coordenadas del píxel actual en el shader especial fragmento variable de gl_FragCoord y usarlas como coordenadas de textura en la textura que contiene la imagen previamente prestados y asimismo gl_FragCoord.x +/- 1 y gl_FragCoord.y +/- 1 para los vecinos. Pero como dijo Matias, necesita dividir estos valores por ancho y alto (de la imagen) respectivamente, ya que las coordenadas de textura están en [0,1]. Al usar GL_CLAMP_TO_EDGE como modo de envoltura para la textura, el hardware de texturación maneja las cajas de borde automáticamente. Entonces, en un borde todavía obtienes 9 valores, pero solo 6 distintos (los otros 3, los que realmente están fuera de la imagen, son solo duplicados de sus vecinos internos).

1

1) Sí, utilizando un FBO es el camino a seguir.

2) Con matemáticas, si está en pixel (x, y), entonces los vecinos son (x + 1, y), (x, y + 1), (x + 1, y + 1), (x-1, y), etc. Los casos de borde se manejan con los modos de ajuste de la textura. Tenga en cuenta que, dado que GL_TEXTURE_2D utiliza coordenadas normalizadas, los desplazamientos no son 1, sino 1/ancho y 1/alto de la textura.

+1

¿Puede ser más específico en cuanto a cómo accedo a los vecinos desde dentro del sombreador de fragmentos? – Nektarios

Cuestiones relacionadas