Question

Je sais comment le faire dans l'autre sens. Mais comment puis-je créer un CIIMage à partir d'une texture, sans avoir à copier dans la mémoire du CPU? [Image CiImageWithData]? CvopengleSTextuRecache?

Était-ce utile?

La solution

Malheureusement, je ne pense pas qu'il y ait un moyen d'éviter d'avoir à lire les données de pixels en utilisant glReadPixels(). Toutes les entrées pour un CIIMage (données, cGimageRef, cvpixelbufferref) sont côté processeur, donc je ne vois pas de chemin rapide pour le délivrer à un CIIMage. Il semble que votre meilleure alternative soit à utiliser glReadPixels() pour attirer les données RGBA brutes de votre texture et l'envoyer dans le Ciimage en utilisant -initWithData:options: Et un kCIFormatRGBA8 Format de pixel. (MISE À JOUR: 14/03/2012) Sur iOS 5.0, il existe maintenant un moyen plus rapide de saisir les données de la trame OpenGl ES, en utilisant les nouveaux caches de texture. Je décris cela en détail dans Cette réponse.

Cependant, il pourrait y avoir un autre moyen de réaliser ce que vous voulez. Si vous souhaitez simplement appliquer des filtres sur une texture pour la sortie à l'écran, vous pourrez peut-être utiliser Mon cadre GPUIMAGE pour faire le traitement. Il utilise déjà OpenGL ES 2.0 comme cœur de son pipeline de rendu, avec des textures comme la façon dont les cadres d'images ou de vidéo sont passés d'un filtre à l'autre. C'est aussi beaucoup plus rapide que l'image de base, dans mes repères.

Vous pouvez fournir votre texture comme une entrée ici, afin qu'elle n'ait jamais à toucher le CPU. Je n'ai pas encore de classe de stock pour saisir des textures brutes à partir d'OpenGl ES, mais vous pouvez modifier le code pour l'une des sous-classes GPUImageOutput existantes pour l'utiliser comme source assez facilement. Vous pouvez ensuite enchaîner les filtres à cela et diriger la sortie vers l'écran ou vers une image immobile. À un moment donné, j'ajouterai une classe pour ce type de source de données, mais le projet est encore assez nouveau.

Autres conseils

Depuis iOS 6, vous pouvez utiliser une méthode d'initiale intégrée pour cette situation:

initWithTexture:size:flipped:colorSpace:

Voir les documents:http://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/quartzcoreframework/classes/ciimage_class/reference/reference.html

Vous pourriez les trouver utiles:

En général, je pense que les données d'image devront être copiées du GPU au CPU. Cependant, les fonctionnalités iOS mentionnées ci-dessus pourraient rendre cela plus facile et plus efficace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top