2011-09-29 3 views
5

J'écris un jeu en 3D qui utilise GL10, mais j'aimerais que l'application supporte GL11 ou GL20 si disponible. Quel est le meilleur design pour soutenir tous les 3? Ou est-ce une course de fou et je devrais juste me concentrer sur le soutien d'une version?Comment prendre en charge OpenGL ES GL10, GL11 et GL20 dans Libgdx?

Mon idée actuelle est de diviser ma fonction render() en renderGL10, renderGL11, renderGL20 et d'appeler la fonction de rendu appropriée en fonction de l'instance GL disponible. A l'intérieur de chaque fonction de rendu est la bonne façon de rendre pour la version GL; il y aura probablement chevauchement pour GL10 et GL11. Est-ce une façon appropriée de gérer mon problème ou existe-t-il un meilleur moyen?

public render(){ 
    if (Gdx.graphics.isGL20Available()){ 
    renderGL20(); 
    } else if (Gdx.graphics.isGL11Available()){ 
    renderGL11(); 
    } else { 
    renderGL10(); 
    } 
} 

EDIT: Solution: Si gl1.x est disponible, GL10 est également disponible (et Gdx.gl10 est non nulle). Donc, mon code devrait rendre généralement être structuré comme suit:

public render(){ 
    // Use Gdx.gl for any gl calls common to all versions 
    if (Gdx.graphics.isGL20Available()){ 
    // Use Gdx.GL20 for all gl calls 
    } else { 
    if (Gdx.graphics.isGL11Available()){ 
     // Use Gdx.gl11 for any gl11 call not supported by gl10 
    } 
    // Use Gdx.gl10 for all gl calls 
    } 
} 

Répondre

10

Utilisez-vous réellement shaders dans votre chemin OpenGL ES 2.0 ou dépendez-vous sur SpriteBatch et Consorts pour gérer les détails sales pour vous? Dans le dernier cas, il n'y a pas de réel avantage à utiliser GLES 2.0 (hormis la non puissance de deux textures, qui peut être plus lente sur certains périphériques)

Généralement, vous choisissez entre GLES 1.x ou 2.0. Si vous y allez avec 1.x, vous n'avez rien à faire. Si vous voulez utiliser 2.0, vous devez créer un AndroidApplicationConfig et définir l'indicateur useGL20 sur true. Si GLES 2.0 n'est pas pris en charge sur l'appareil sur lequel vous exécutez votre application, libgdx retournera à 1.x. Vous pouvez ensuite utiliser votre boucle de rendu ci-dessus qui utilisera GLES 2.0 si disponible et retombera à 1.x sinon. Toutefois, il est peu probable que vous ayez des chemins distincts pour les versions 1.0 et 1.x, sauf si vous utilisez directement les appels GLES.

+1

Je n'utilise pas beaucoup de parties de la bibliothèque, pour l'instant; J'explore comment je veux le concevoir sans grande connaissance de gles2.0 ou comment libgdx traite gl1.x. J'utilise ce jeu pour élargir ma connaissance de la programmation de jeux et GLES, donc je voudrais soutenir les deux afin que je puisse essayer d'apprendre GLSL. Basé sur votre réponse à propos de 1.x, j'ai juste fait un rapide coup d'oeil à la source pour backends Android et Jogl et remarqué que lorsque gl11 est disponible, Gdx.gl10 = Gdx.gl11; Je m'attendais à ce que gl10 soit nul si gl11 était défini (de la même façon que gl10 et gl11 sont nulles quand 2.0 est disponible). Ceci et votre réponse ont vraiment aidé. – Doran