Copie arbitrairement bloc de taille de pixels dans la texture OpenGL ES ... en quelque sorte?

StackOverflow https://stackoverflow.com/questions/894431

Question

Je vous écris une application de dessin, et la toile de dessin est une texture OpenGL. Lorsque vous dessinez sur la toile, il détermine dans quelle région de la texture de la toile a été modifiée, et la copie des données de pixels sur (en utilisant glReadPixels) avant d'appliquer les modifications apportées.

Pour annuler, je veux revenir tout simplement à l'état de la texture précédente en utilisant les données de pixels qui a été recopié. Cependant, OpenGL ES ne fournit pas une commande glDrawPixels. Quelle est la meilleure façon de le faire?

Je l'ai examiné deux options, mais je ne suis pas sûr non plus est ce grand:

  1. Créer une texture temporaire en utilisant les pixels que je recopié et piochez dans. (Toutefois, la région copiée n'est pas une puissance de deux!)

  2. Détachez la grande texture toile complètement, modifier manuellement les octets de la texture, puis remettez-le dans OpenGL. Je ne suis pas en utilisant toute sorte de compression, de sorte que ce ne serait pas si mal que ça. Mais il semble que un hack?

Tout le monde a des idées? Je voudrais vraiment l'apprécier!

Était-ce utile?

La solution

Dans le cas où quelqu'un tombe par hasard sur ce tout en essayant de faire quelque chose de semblable, je suis venu avec une solution qui semble bien fonctionner.

  1. Prenez une image de la texture actuelle en le liant au framebuffer puis écrire le framebuffer à un CGImageRef.
  2. Créer une nouvelle CGContext et de dessiner dans la CGImageRef texture existante. Ensuite, dessinez les anciennes données de texture dans la partie que l'utilisateur a changé, « défaisant » efficacement que le changement à l'image.
  3. Destroy vieille texture OpenGL et créer une texture de la CGContext.

Je pense que cela est une façon assez lente d'aller sur les choses, mais je ne ai pas besoin énorme performance - ma préoccupation réelle limitait la quantité de données conservés pour représenter la texture « ancienne »

.

Si vous avez besoin d'aide (il y a un peu de code) ne hésitez pas à me contacter.

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