2013-02-05 4 views
7

J'essaie de recréer le GPUImageTwoPassFilter de GPUImage(ios) pour Android. Je travaille the work done here pour un port Android de GPUImage. Le port fonctionne vraiment bien pour beaucoup de filtres. J'ai porté sur beaucoup de shaders, essentiellement ligne pour la ligne avec un grand succès.Que fait réellement TwoPassFilter GPUImage?

Le problème est que pour porter certains des filtres, vous devez étendre à partir du GPUImageTwoPassFilter de GPUImage, que l'auteur de la version android n'a pas encore implémenté. Je veux essayer de l'écrire, mais malheureusement, la version iOS est très non documentée, donc je ne suis pas vraiment sûr de ce que le filtre TwoPass est censé faire.

Quelqu'un a-t-il des conseils pour s'y prendre? J'ai une connaissance limitée d'openGL, mais très bonne connaissance d'Android et d'iOS. Je suis vraiment à la recherche d'une description très psudocode ici

+0

+1 nous avons besoin de personnes qui travaillent sur ce sujet pour android! C'est un projet génial open source, l'ayant utilisé sur iOS et manquant sur Android –

+0

Honnêtement, si ce filtre existait, le projet serait instantanément aussi valable sur Android – Jameo

+0

Le 'GPUImageMovieWriter' est également extrêmement précieux selon le cas d'utilisation, mais c'est un domaine où le portage vers Android peut s'avérer être ** très difficile. –

Répondre

6

Je suppose que je dois expliquer ma pensée ici.

Comme son nom l'indique, au lieu de simplement appliquer une seule opération à une image d'entrée, cela fait défiler deux passes de shaders l'une après l'autre. Ceci est nécessaire pour les opérations comme les flous gaussiens, où j'utilise un noyau séparable pour effectuer un flou vertical puis un flou horizontal (réduit les lectures de texture de 81 à 18 sur un flou de 9 frappes). Je l'utilise également pour réduire les images à leur composante de luminance pour la détection des contours, bien que j'ai récemment fait en sorte que les filtres détectent s'ils recevaient du contenu monochrome pour rendre cela facultatif. Par conséquent, cela étend la base GPUImageFilter pour utiliser deux framebuffers et deux programmes de shader au lieu d'un seul de chaque. Dans la première passe, le rendu se produit exactement comme avec un GPUImageFilter standard. Cependant, à la fin de cela, au lieu d'envoyer la texture résultante au filtre suivant dans la chaîne, cette texture est prise en entrée pour une seconde passe de rendu. Le filtre bascule vers le second programme de shaders et exécute celui-ci par rapport à la première texture de sortie pour produire une deuxième texture de sortie, qui est finalement transmise comme sortie de ce filtre.

Le filtre remplace uniquement les méthodes de GPUImageFilter requises pour cela. Une chose difficile à surveiller est le fait que je corrige la rotation de l'image d'entrée dans la première étape du filtre, mais la deuxième étape ne doit pas faire tourner à nouveau l'image. C'est pourquoi il y a une différence dans les coordonnées de texture utilisées pour les première et deuxième étapes. De même, les filtres comme les flous qui échantillonnent dans une seule direction peuvent avoir besoin d'avoir leurs entrées d'échantillonnage inversées selon que le premier étage fait tourner l'image ou non.

Il y a aussi des éléments d'optimisation de la mémoire et de mise en cache des shaders, mais vous pouvez ignorer ceux qui sont en cours de portage sur Android.

+0

En plus de ne pas avoir à faire deux rotations ou à translater deux fois les coordonnées du framebuffer (une pour chaque passe), est-ce différent d'enchaîner deux filtres en utilisant un groupe de filtres? – Jameo

+0

@Jameo - Pas de manière significative, non. Je l'ai écrit avant de créer les groupes de filtres en tant que concept. C'est peut-être un cheveu plus rapide à cause d'un peu de frais généraux, mais pas d'une quantité perceptible. Cela fait que vous n'avez pas besoin de créer des types de filtres personnalisés pour les sous-opérations dans les groupes, donc cela peut rendre le framework un peu plus propre. –

Questions connexes