Question

Ahoy!

J'ai cherché à mettre à jour un ancien code de test dans le but de se replier sur les nouvelles fonctionnalités ajoutées à GLKIT. Jusqu'à présent, j'ai réussi à configurer un GLKViewController et à commencer à rendre certaines formes de base, mais j'ai eu du mal à trouver des informations décentes concernant GLKBasEEFFECT.

La documentation GLKBaseeffect indique:

Au moment de l'initialisation, votre application crée d'abord un contexte OpenGL ES 2.0 et le rend à jour. Ensuite, il alloue et initialise un nouvel objet d'effet, configure ses propriétés et appelle sa méthode PrepareToDraw. La liaison d'un effet entraîne une compilation et lié un shadder au contexte OpenGl ES actuel. L'effet de base nécessite également que les données de sommet soient fournies par votre application. Pour fournir des données de sommet, créez un ou plusieurs objets de tableau de vertex. Pour chaque attribut requis par le shader, l'objet Vertex Array doit activer l'attribut et pointer des données stockées dans un objet tampon Vertex.

Ce que j'ai du mal à discerner, c'est;

Ai-je besoin d'un objet glkbaseeffect pour chaque "modèle" que je rend? Ou est-ce que j'utilise un seul glkbaseeffect pour chaque "scène" et change simplement les propriétés à la volée avant d'appeler PrepareToDraw?

J'ai vu quelques tutoriels pour les moteurs de jeu et les rendus qui utilisent simplement un seul GLKBaseeffect pour chaque modèle, mais cela semble tout à fait inefficace si la même chose pouvait être réalisée avec une seule instance à la place.

En lisant la documentation, il semble que ce soit la meilleure approche, mais étant donné que j'ai vu tant de gens utiliser plusieurs instances, je commence à penser que ce n'est pas le cas.

Quelqu'un peut-il nous éclairer à ce sujet? Glkit est encore assez nouveau pour iOS (et pour moi), donc toute information serait grandement appréciée.

Était-ce utile?

La solution

Non, vous ne devez pas créer un GLKBasEEFFECT unique pour chaque objet. Par exemple, si vous dessinez un labyrinthe, chaque brique dans ce labyrinthe peut être son propre objet, mais ils peuvent tous partager le même glkbaseeffect. N'oubliez pas cependant que GlkBaseeffect stocke également des informations sur l'emplacement ainsi que la texture, l'éclairage, le brouillard, etc. Donc, si vous voulez dessiner les briques à plus d'un endroit (ce que je suppose que vous faites :-) vous ajustez leur matrice de transformation, puis appelez puis appelez L'API «PRETEPETODRAW».

Je suis d'accord que nous avons besoin de plus de tutoriels écrits par des gens qui ont utilisé GLKBaseeffect de manière approfondie pour obtenir plus d'informations sur les meilleures pratiques pour ce nouveau cadre.

Bonne navigation ..

Autres conseils

Chaque changement des propriétés "fondamentales" (LightingType, LightModeltWosided, ColorMaterialEnabled, ...) entraînera le chargement d'un nouveau programme de shader avec le prochain appel "PrepareToDraw".

Donc, si vous n'utilisez pas de commande de rendu, peu importe si vous utilisez un effet pour chaque objet rendu ou un seul effet changeant pour tous les objets. Dans les deux cas, vous vous retrouverez avec un appel inutile GLUSEPROgram et beaucoup de changements d'état OpenGL inutiles pour chaque objet dessiné. (Utilisez le modèle d'instruments "OpenGl ES Analysis" pour étudier les appels OpenGL générés)

Cela dit, votre conern principal devrait être de commander vos objets pour le rendu. Au moins regrouper tous les objets qui utilisent le même programme de shader. Créez et utilisez ensuite un objet GLKBaseeFect pour chacun de ces groupes. Si vous ne savez pas si un changement de propriété GLKBASEEFFECT entraînera le chargement d'un nouveau programme Shader, je recommande d'utiliser des instruments pour enquêter sur les appels OpenGL.

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