2009-01-08 8 views
6

Je rends une certaine scène dans une texture et ensuite j'ai besoin de traiter cette image de manière simple. Comment je fais cela maintenant est de lire la texture en utilisant glReadPixels(), puis le traiter sur le CPU. C'est cependant trop lent donc je pensais à déplacer le traitement vers le GPU. La configuration la plus simple pour ce faire est d'afficher un simple quad blanc qui occupe la totalité de la fenêtre dans une projection orthogonale, puis d'écrire le bit de traitement d'image sous la forme d'un fragment shader. Cela permettra à de nombreuses instances du traitement de s'exécuter en parallèle et d'accéder à n'importe quel pixel de la texture dont il a besoin pour le traitement.Texture Traitement d'image sur le GPU?

Est-ce un plan d'action viable? Est-il courant de faire les choses de cette façon? Y a-t-il peut-être une meilleure façon de le faire?

Répondre

2

Oui, c'est la façon habituelle de faire les choses.

  1. Rendu quelque chose dans une texture. Dessinez un quad fullscreen avec un shader qui lit cette texture et effectue certaines opérations.

Des effets simples (par exemple échelle de gris, correction de couleur, etc.) peuvent être obtenus en lisant un pixel et en sortant un pixel dans le fragment shader. Des opérations plus complexes (par exemple des motifs tourbillonnaires) peuvent être effectuées en lisant un pixel à partir d'un emplacement décalé et en sortant un pixel. Des opérations encore plus complexes peuvent être effectuées en lisant plusieurs pixels.

Dans certains cas, plusieurs textures temporaires seraient nécessaires. Par exemple. flou avec rayon élevé est souvent fait de cette façon:

  1. Rendu dans une texture.
  2. Rendu dans une autre texture (plus petite), avec un shader qui calcule chaque pixel de sortie en tant que moyenne de plusieurs pixels source.
  3. Utilisez cette texture plus petite pour la restituer dans une autre petite texture, avec un shader qui applique un flou gaussien ou autre.
  4. ... répéter

Dans tous les cas ci-dessus si, chaque pixel de sortie doit être indépendant des autres pixels de sortie. Il peut très bien utiliser un pixel d'entrée de plus.

Un exemple d'opération de traitement qui n'est pas bien mappé est la table sommée, où chaque pixel de sortie dépend du pixel d'entrée et de la valeur du pixel de sortie adjacent. Pourtant, il est possible de faire ces types sur le GPU (example pdf).

2

Oui, c'est la manière normale de faire du traitement d'image. La couleur du quad n'a pas vraiment d'importance si vous définissez la couleur pour chaque pixel. En fonction de votre application, vous devrez peut-être faire attention aux problèmes d'échantillonnage de pixels (c'est-à-dire en veillant à échantillonner exactement le pixel correct sur la texture source, plutôt qu'à mi-chemin entre deux pixels).

Questions connexes