10
votes

Comment puis-je implémenter Annuler dans une application de peinture OpenGL ES sur l'iPhone?

J'utilise l'exemple d'application d'Apple Glpaint comme base d'une application de peinture OpenGL ES, mais je ne peux pas comprendre comment implémenter des fonctionnalités d'annulation de celui-ci.

Je ne veux pas prendre des images de chaque coup et les stocker. Y a-t-il un moyen d'utiliser différents objets de tampon de cadre pour implémenter une annulation? Avez-vous d'autres suggestions pour de meilleures façons de faire cela?


0 commentaires

4 Réponses :


10
votes

Utilisez des objets de tampon Vertex (VBO) pour rendre votre contenu. Sur chaque nouvelle course, copiez la dernière liste VBO à une liste des moins récemment utilisées (LRU). Si votre LRU est plein, supprimez le VBO le moins récemment utilisé. Pour restaurer (annuler) la dernière course utilise simplement le plus récent VBO de la LRU et le rendu.

VBO: http://developer.apple.com/iphone /Library/documentation/3ddrawing/conceptual/opengles_programmingGuide/techniquesForworkingWitTexData/techniquesForworkingWitTHvertexData.html

LRU: http://fr.wikipedia.org/wiki/cache_algorithms#lease_algorithms#lease_rectement_utilisé


6 commentaires

Pourriez-vous s'il vous plaît fournir un exemple de code sur la manière de mettre en œuvre cela?


Shake pour annuler :-) Est-ce que cela fonctionne pour vous? github.com/Larsxschneider/undo-in-opengl-es


Fonctionne parfaitement, merci beaucoup! Je serai en contact pour vous montrer ce que j'ai fait avec elle. Bounty bien mérité.


@antalerkerekes je suis intéressé et je suis impatient d'y être :-)


Malheureusement, cela ne fonctionne pas du tout. Comparaison avec le code original de GLPaint, il n'a vraiment pas annulé toute une fois. Mais l'annulation ne fonctionne pas comme prévu. Cela n'écrit pas la dernière action et la couleur a changé de mal après annuler.


N'auriez-vous pas obligé de rendre tous les objets tampons de sommet précédents afin que cela soit égal à ce que cela ressemble à droite?



6
votes

Je recommanderais d'utiliser Nsundomanager pour stocker une liste des actions de dessin réelles entreprises par l'utilisateur (ligne de tirage à partir d'ici à l'aide de ce pinceau, etc.). Si elle est stockée comme une liste des coordonnées de X, Y pour le dessin vectoriel, ainsi que toutes les autres métadonnées nécessaires pour recréer cette partie du dessin, vous n'utiliserez nulle part près de la mémoire que de stocker des images, des objets de tampon de sommet ou des objets à colonne .

En fait, si vous stockez ces étapes de dessin dans une base de données de données de base, vous pouvez presque obtenir un annulation / refait gratuitement. Voir ma réponse ici pour plus .


2 commentaires

Enregistrement de toutes les étapes, puis les redessiner -Les étape (Annuler) peut devenir très lente lorsque vous avez de nombreuses étapes pour redessiner, je manque quelque chose?


Je suggérerais de stocker une image brute tous les 10 points de contrôle de 10 ou donc de sorte que vous n'avez pas à redessiner les 100 dernières marches ou quelque chose de fou



-1
votes

Soit vous pouvez utiliser Nsundomanager, la classe fournie par iOS

ou vous pouvez enregistrer l'état actuel de la zone d'écran par: xxx

Vous pouvez avoir un tableau en tant que pile avec Objets d'image d'écran et sur Action d'annulation, vous pouvez faire une valeur de la pile et sur chaque modification de la valeur de la pile dans la pile.


1 commentaires

L'astucieux recherche une solution impliquant OpenGL ES et des états graphiques que vous décrivez uniquement le travail des graphiques principaux. Ils ne s'appliqueraient pas ici.



1
votes

Pour annuler dans une application graphique, vous pouvez utiliser ConeData.

Voici un blogpost détaillé et Lisez celui-ci aussi.


0 commentaires