2009-09-09 4 views
3

J'ai un rendu de scène opengl sur un calque EAGLView et d'autres éléments (cercles et autres) de rendu sur un UIView (qui est un frère de l'EAGLView, positionné au-dessus). Est-il possible de mélanger les couleurs entre les deux couches? J'aimerais faire un peu de mélange pour obtenir un effet d'inversion sur les couleurs d'EAGLView.Comment puis-je fusionner mon UIView et mon EAGLView?

J'ai joué avec CGBlendMode mais cela ne semble affecter que ce que je dessine dans cette vue actuelle. Je pense que cela a quelque chose à voir avec le CGContext mais je suis un peu flou sur les détails, puis-je forcer UIView et EAGLView à avoir le même CGContext pour que le mélange fonctionne entre eux?

Aide, corrections, clarifications sont toutes appréciées. Merci d'avance, -S

Répondre

7

La réponse courte est que vous ne pouvez pas. Une longue réponse suit. Par EAGLView, vous devez indiquer la sous-classe UIView incluse dans le modèle OpenGL ES de Xcode. Ce qui rend cette classe spéciale, c'est que la méthode de classe layerClass est substituée et renvoie la classe CAEAGLLayer au lieu de la classe CALayer, comme c'est le cas par défaut.

UIView et CALayer fonctionnent par paires. Tous les objets UIView sont soutenus par un CALayer, l'objet CALayer est l'objet responsable de la mise en page et du rendu à l'écran. Le UIView est un délégué au CALayer, et est responsable de dessiner ses graphiques en cas de besoin.

CALayer va laisser déléguer (le UIView) dessiner dans un CGContextRef. Il s'agit d'un contexte par UIView, vous ne pouvez donc pas utiliser CGBlendMode pour fusionner plusieurs vues, car il ne fonctionnera que dans un seul contexte UIView.

La fusion de CALayer doit être effectuée en utilisant les propriétés du filtre. Ceux-ci sont définis pour iPhone OS mais les filtres disponibles sont undefined selon la documentation. C'est parce que Core Image n'est pas disponible sur iPhone OS pour le moment.

0

Je ne pense pas que vous serez en mesure de mélanger les couleurs dans ce sens. Le mieux que vous puissiez faire est de masquer complètement l'autre, ou d'avoir une couche supérieure semi-transparente (auquel cas vous verrez la partie en dessous) - mais vous ne pourrez pas faire de dessin de type XOR.

Questions connexes