2009-01-08 9 views
6

Estoy representando una escena determinada en una textura y luego necesito procesar esa imagen de una manera simple. Cómo estoy haciendo esto ahora es leer la textura usando glReadPixels() y luego procesarla en la CPU. Sin embargo, esto es demasiado lento, así que estaba pensando en mover el procesamiento a la GPU.¿Procesamiento de imagen de textura en la GPU?

La configuración más simple para hacer esto que podría pensar es mostrar un simple cuadrángulo blanco que ocupa toda la ventana gráfica en una proyección ortogonal y luego escribir el bit de procesamiento de imágenes como un sombreador de fragmentos. Esto permitirá que muchas instancias del procesamiento se ejecuten en paralelo, así como también acceder a cualquier píxel de la textura que requiere para el procesamiento.

¿Es esto un curso de acción viable? ¿Es común hacer las cosas de esta manera? ¿Existe tal vez una mejor manera de hacerlo?

Respuesta

2

Sí, esta es la forma habitual de hacer las cosas.

  1. Ponga algo en una textura.
  2. Dibuja un quad de pantalla completa con un sombreador que lea esa textura y realice algunas operaciones.

Los efectos simples (por ejemplo, escala de grises, corrección de color, etc.) se pueden realizar leyendo un píxel y generando un píxel en el sombreador de fragmentos. Se pueden realizar operaciones más complejas (por ejemplo, patrones de remolino) leyendo un píxel desde la ubicación de desplazamiento y emitiendo un píxel. Se pueden hacer operaciones aún más complejas leyendo múltiples píxeles.

En algunos casos, se necesitarían texturas temporales múltiples. P.ej. la falta de definición con el radio alto a menudo se hace de esta manera:

  1. Renderizar en una textura.
  2. Renderice en otra textura (más pequeña), con un sombreador que calcule cada píxel de salida como el promedio de múltiples píxeles de origen.
  3. Usa esta textura más pequeña para convertirla en otra textura pequeña, con un sombreador que hace la difuminación gaussiana adecuada o algo así.
  4. ... repetir

En todos los casos anteriores, sin embargo, cada píxel de salida debe ser independiente de otros píxeles de salida. Puede usar uno o más píxeles de entrada muy bien.

Un ejemplo de operación de procesamiento que no se correlaciona bien es la Tabla de áreas resumidas, donde cada píxel de salida depende del píxel de entrada y el valor del píxel de salida adyacente. Aún así, es posible hacer esos tipos en la GPU (example pdf).

2

Sí, es la forma normal de procesar imágenes. El color del quad realmente no importa si vas a establecer el color para cada píxel. Dependiendo de su aplicación, es posible que deba tener cuidado con los problemas de muestreo de píxeles (es decir, asegurarse de que muestrea exactamente el píxel correcto en la textura de la fuente, en lugar de a medio camino entre dos píxeles).

Cuestiones relacionadas