OpenGL vs OpenGL ES 2.0 – Une application OpenGL peut-elle être facilement scope?

Je travaille sur une sorte de framework de jeu et je suis un nouveau venu dans OpenGL. La plupart des livres ne semblent pas donner une réponse très claire à cette question et je veux développer sur mon bureau avec OpenGL, mais exécuter le code dans un environnement OpenGL ES 2.0. Ma question est double:

  1. Si je cible mon framework pour OpenGL sur le bureau, sera-t-il exécuté sans modification dans un environnement OpenGL ES 2.0?
  2. Sinon, existe-t-il un bon émulateur, PC ou Mac? existe-t-il un script que je peux exécuter pour convertir mon code OpenGL en code OpenGL ES ou pour signaler des éléments qui ne fonctionnent pas?

Cela fait environ trois ans que je ne travaillais pas sur ES pour la dernière fois, donc je suis peut-être dépassé ou simplement me souvenir de certaines choses de manière incorrecte.

  1. Non, le ciblage d’OpenGL pour les postes de travail ne correspond pas au ciblage d’OpenGL ES, car ES est un sous-ensemble. ES glBegin() pas les fonctions de mode immédiat ( glBegin() / glEnd() , glVertex*() , …) Les tableaux de vertex sont le principal moyen d’envoyer des fichiers dans le pipeline.

    En outre, cela dépend du profil que vous ciblez: au moins dans le profil Lite, ES n’a pas besoin d’implémenter des fonctions à virgule flottante. Au lieu de cela, vous obtenez des fonctions fixes; pensez à des entiers de 32 bits où les 16 premiers bits signifient des chiffres avant le point décimal, et les 16 bits suivants signifient des chiffres après le point décimal.

    En d’autres termes, même un code simple peut ne pas être utilisable s’il utilise des flottants (vous devrez remplacer les appels aux fonctions gl*f() par des appels aux fonctions gl*x() .

    Voyez comment vous pouvez résoudre ce problème dans l’exemple de Trolltech (en particulier le fichier qtwidget.cpp ; c’est l’exemple de Qt, mais quand même …). Vous verrez qu’ils font cet appel:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    Ceci est destiné à remplacer l’appel à glClearColorf (). De plus, ils utilisent la macro f2vt() , ce qui signifie flotter au type de sumt , ce qui convertit automatiquement l’argument de float au type de données correct.

  2. Il y a trois ans, alors que je développais de petites démos pour une entreprise, j’ai réussi à travailler avec le SDK de PowerVR . C’est pour Visual C ++ sous Windows; Je ne l’ai pas essayé sous Linux (pas besoin de travailler sur le PC de l’entreprise).


Une petite mise à jour pour refléter mes expériences récentes avec ES. (7 juin 2011)

  • Les plateformes d’aujourd’hui n’utilisent probablement pas le profil Lite, vous n’avez donc probablement pas à vous soucier des décimales à virgule fixe
  • Lorsque vous portez votre code de bureau pour mobile (par exemple, iOS), vous devrez probablement le faire principalement, et pas grand-chose d’autre:
    • remplacez glBegin() / glEnd() par des tableaux de sumts
    • remplacer certains appels à des fonctions telles que glClearColor() avec des appels tels que glClearColorf()
    • réécrire votre système de fenêtrage et d’entrée
    • si vous ciblez OpenGL ES 2.0 pour obtenir des fonctionnalités de shader, vous devrez maintenant remplacer complètement le comportement intégré du pipeline à fonction fixe par des shaders – du moins ceux de base qui réimplémentent le pipeline à fonction fixe
  • Vraiment important: à moins que votre système mobile ne soit pas limité en mémoire, vous voulez vraiment utiliser la compression de texture pour votre puce graphique; Par exemple, sur les appareils iOS, vous allez télécharger des données compressées au format PVRTC sur la puce.

Dans OpenGL ES 2.0, qui est ce que les nouveaux gadgets utilisent, vous devez également fournir vos propres shaders de sumts et de fragments car l’ancien pipeline de fonctions fixes a disparu. Cela signifie que vous devez faire vous-même tous les calculs d’ombrage, des choses qui seraient assez complexes, mais vous pouvez trouver des implémentations existantes sur les didacticiels GLSL.

Cependant, GLES étant un sous-ensemble d’OpenGL de bureau, il est possible d’exécuter le même programme sur les deux plates-formes.

D’après ce que je comprends, OpenGL ES est un sous-ensemble d’OpenGL. Je pense que si vous vous abstenez d’utiliser des éléments en mode immédiat, comme glBegin () et glEnd (), vous devriez vous en sortir. Je n’ai pas beaucoup fait avec OpenGL au cours des deux derniers mois, mais lorsque je travaillais avec ES 1.0 tant que je n’utilisais pas glBegin / glEnd, tout le code appris par OpenGL standard fonctionnait.

Je sais que le simulateur iPhone exécute le code OpenGL ES. Je ne suis pas sûr de celui d’Android.

Voici l’ émulateur Windows.

Je connais deux projets pour fournir une traduction GL entre un ordinateur de bureau et un ordinateur personnel:

  • glshim : pipeline fixe substantiel vers le support 1.x, support de base ES 2.x.

  • Regal : N’importe quoi à ES 2.x.

Option 3) Vous pouvez utiliser une bibliothèque comme Qt pour gérer votre code OpenGL en utilisant leurs fonctions d’emballage intégrées. Cela vous donne la possibilité d’utiliser une base de code (ou des bases de code différentes au minimum) pour OpenGL et de créer pour la plupart des plates-formes de votre choix. Vous n’avez pas besoin de le porter pour chaque plate-forme que vous souhaitez prendre en charge. Qt peut même choisir le contexte OpenGL en fonction des fonctions que vous utilisez.