Comment convertir une texture ouverte en un Ciimage
-
14-11-2019 - |
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?
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:
- https://developer.apple.com/library/ios/#samplecode/rosywriter/introduction/intro.html
- https://developer.apple.com/library/ios/#samplecode/glcameraripple/listings/glcameraripple_rippleviewcontroller_m.html
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.