À la demande OpenGL ES rendu à l'aide des GLKit
Je suis à la recherche dans la conversion de mon rendu OpenGL code pour profiter de quelques fonctionnalités de GLKit
(à savoir l'asynchrone texture de chargement et de l'automatisation fournis par GLKView/Controller
). Cependant, il apparaît que les classes sont principalement conçues pour accueillir les personnes de rendu à l'aide d'une boucle d'animation, alors que je suis en train de travailler avec un rendu à la demande. En outre, certains le rendu est d'une texture plutôt que de la GLKView du framebuffer, alors je devrais être à la recherche pour juste sous-classe de la GLKView et d'ajouter de nouvelles organisations confessionnelles?
Est là une approche recommandée pour ce type de configuration? Je m'attends à quelque chose le long des lignes de:
- Définir l'affichage du contrôleur de
preferredFramesPerSecond
à0
, ou tout simplement
pause le cadre des mises à jour? - Ignorer la
glkViewControllerUpdate
ouglkView:drawInRect:
méthodes
et il suffit de dessiner ce dont j'ai besoin, quand j'en ai besoin. - Utiliser la vue du
setNeedsDisplay
comme normale avec uneUIView
dans l'ordre
pour afficher l'image (ai-je besoin d'appelerbindDrawable
étant donné que je
sera rendu à une texture?).
Peut-être que ça ne vaut pas la peine si ce n'est pas ce que la nouvelle API est conçue pour? Je souhaite que la documentation a été un peu plus approfondie qu'elle ne l'est. Peut-être plus les échantillons seront fournis lors de l'API a "mûri" un peu...
Grâce
- vous pouvez toujours vous rendre à l'enseignement secondaire FBO en conjonction avec GLKit. mickyd.wordpress.com/2012/05/20/...
Vous devez vous connecter pour publier un commentaire.
L'approche que j'ai utilisé était de ne pas s'embêter avec le
GLKViewController
, mais il suffit d'utiliserGLKView
directement sous uneUIViewController
sous-classe.Clairement, le
GLKViewController
est conçu pour être utilisé par des personnes qui ont besoin d'une présentation cohérente de la boucle pour des applications telles que des jeux. Sans elle, le dessin de laGLKView
est aussi simple que d'appeler[glkView setNeedsDisplay]
. Assurez-vous de définirenableSetNeedsDisplay
àYES
afin de permettre à ce comportement.Si vous n'avez encore envie de faire l'utilisation d'un
GLKViewController
, vous pouvez désactiver l'animation boucle de rendu dansviewWillAppear
comme suit:Aussi, ensemble
resumeOnDidBecomeActive
àNO
pour empêcher l'affichage de contrôleur de reprendre à nouveau automatiquement.En utilisant un simple
UIViewController
avec unGLKView
est parfaitement acceptable, cependant, et je l'ai vu, il est recommandé par une Pomme ingénieur comme un moyen approprié pour effectuer sur demande de dessin.GLKViewController
dans le code, peut-être le mettre sur la ligne après votrealloc
/init
. Si vous le créez dans interface builder, puis la mise en œuvre de la-awakeFromNib
méthode dans votre vue-contrôleur pourrait être un bon endroit pour cela. En général, les propriétés de ce type doit être défini après l'/que l'objet est créé, mais avant de l'utiliser.J'ai juste converti mon code à partir de l'aide d'un EAGLContext manager, j'ai roulé en moi-même à l'aide de la GLKit classes.
Vous suggérons de vous peut "ignorer..le..
glkView:drawInRect:
méthodes et il suffit de dessiner ce que [vous] besoin, quand j'en ai besoin". Cela semble être une option raisonnable en terme de performance; je suppose (mais n'ai pas essayé) si vous ne spécifiez pas unGLKViewDelegate
ou de fournir un sous-classéGLKView
avec sesdrawInRect:
défini, pas d'animation de la boucle de rendu va se produire. Avez-vous essayé ceci?L'alternative serait de créer simplement quelques
@property (assign, nonatomic) BOOL shouldUpdate;
dans votreMyController : GLKViewController <GLKViewDelegate>
classe qui ne sera mise à jour si il y a quelque chose à faire:Je suis sûr que vous avez l'idée, il n'est guère compliqué.
Une chose à noter: la officielle de l'API docs état que
viewDidLoad
doit être utilisé dans votreGLKViewController
initiale programme d'installation de GL. J'ai eu des problèmes avec cela; pour une raison quelconque monglCreateShader
appelle toujours revenu à zéro. Cela peut être dû à ma définition de laEAGLContext
post-initialisation; je ne pouvais pas passer comme uninit
paramètre depuis que j'ai créé le contrôleur dans le Storyboard. Cependant, il n'y a rien de logiquement de mal avec le code, donc, je vous offre ce sympathique message d'avertissement dans le cas où vous rencontrez des problèmes similaires. Ma solution est tout simplement d'avoir de la suite dans mon drawInRect:Évidemment, il n'est pas idéal d'avoir un SI y inutilement, mais c'était une solution de facilité.
Laissez-moi savoir comment ça se passe si vous essayez de mettre à jour pour utiliser GLKit.
viewDidLoad
problème, votreEAGLContext
doit être défini avant la création de votre shaders, comme vous l'avez remarqué vous-même. Il n'y a pas de mal à faire cela dansviewDidLoad
trop, directement avant l'installation le reste de votre code GL. Jetez un oeil à la "OpenGL Jeu" modèle de projet dans Xcode pour un bon exemple de la façon d'effectuer cette installation.Après avoir créé GLKView, ajoutez cette ligne:
glkView.enableSetNeedsDisplay = TRUE;
(En raison de cela, personne ne le rafraîchissement de l'affichage automatiquement)
Quand vous voulez redessiner, insérez cette ligne:
... puis
drawInRect
routine sera appelée qu'une seule fois.Espère que cela aide.
enableSetNeedsDisplay
àNO
désactiveGLKView
'ssetNeedsDisplay
méthode. Cette propriété est automatiquement mis àNO
lors de l'utilisation d'unGLKViewController
, et il est donc, en fait, obligatoire que vous définissez manuellement àYES
lors de l'élaboration de setNeedsDisplay "mode".