Programmation graphique 3D en Java, Partie 3: OpenGL

Cela fait un moment depuis notre dernier volet de cette série sur la programmation graphique 3D en Java (plus de détails à la fin de cette colonne). Voici un rappel rapide de ce dont nous avons discuté pour la dernière fois et de ce que nous avons laissé.

Dans les deux colonnes précédentes (voir Ressources), nous avons exploré Java 3D. Nous avons discuté du contenu statique et des petites scènes, puis utilisé des graphiques de scène plus grands et intégré l'interactivité dans certains mondes 3D de base.

Maintenant que vous en savez un peu plus sur l'utilisation de Java 3D, il est temps de comparer et de contraster l'approche Java 3D des graphiques 3D avec le principal concurrent de l'API graphique: OpenGL.

Veuillez noter que cet article était à l'origine destiné à être gourmand en code, mais la décision de dernière minute par Arcane Technologies concernant la liaison Magician (voir ci-dessous) a nécessité la suppression des exemples de code. J'espère que le contenu de cet article pourra être adapté pour une future liaison Java-OpenGL, qui n'est pas encore disponible auprès du consortium OpenGL.

Dans tous les cas, je me suis efforcé de fournir toutes les références et URL pertinentes et utiles liées à OpenGL dans les ressources à la fin de cette colonne. Si vous souhaitez approfondir Java-OpenGL, je vous recommande vivement de consulter ces références.

Comparaison Java-OpenGL avec Java 3D

Dans les versions précédentes sur Java 3D, j'ai fourni une liste des forces et des faiblesses de l'utilisation de Java 3D pour les applications graphiques. Reprenons cette liste, mais faisons-le en examinant les forces et les faiblesses des solutions basées sur Java-OpenGL au lieu des solutions basées sur Java 3D.

Points forts de l'utilisation d'OpenGL (et, par extension et le cas échéant, des liaisons Java-OpenGL):

  • OpenGL fournit un modèle procédural de graphiques

    Cela correspond étroitement à de nombreux algorithmes et méthodes utilisés par les programmeurs graphiques dans le passé. Le modèle procédural est à la fois intuitif et simple pour de nombreux aficionados accomplis du graphisme 3D.

  • OpenGL fournit un accès direct au pipeline de rendu

    Cela est vrai avec toutes les différentes liaisons de langage, y compris la plupart des liaisons Java. OpenGL permet aux programmeurs de spécifier directement comment les graphiques doivent être rendus. On ne se contente pas d' indiquer et de demander comme avec Java 3D, on stipule.

  • OpenGL est optimisé de toutes les manières imaginables

    OpenGL est optimisé dans le matériel et les logiciels et les plates-formes ciblées allant des PC et consoles de jeu les moins chers aux supercalculateurs graphiques les plus haut de gamme.

  • Les fournisseurs de tous les types de matériel graphique 3D prennent en charge OpenGL

    OpenGL est

    la

    standard par rapport auquel les fournisseurs de matériel mesurent leur technologie graphique, sans exception. Comme Microsoft a rejoint SGI dans l'initiative Fahrenheit, il est devenu de plus en plus évident pour beaucoup qu'il s'agit en fait de la reconnaissance indirecte de Microsoft qu'OpenGL a remporté la guerre des API pour les graphiques 2D et 3D.

D'un autre côté, rien n'est parfait. OpenGL, et certainement les liaisons Java-OpenGL, présentent des lacunes importantes:

  • Les forces de l'approche procédurale de la programmation graphique sont simultanément une faiblesse pour de nombreux programmeurs Java

    Pour les programmeurs relativement nouveaux, dont beaucoup ont peut-être reçu leur première instruction de programmation formelle en Java en utilisant des méthodologies orientées objet, la méthode procédurale d'OpenGL ne s'accorde pas bien avec une approche orientée objet et de bonnes pratiques d'ingénierie.

  • Les optimisations OpenGL de nombreux fournisseurs visent à réduire le choix de matériel

    Il est dans le meilleur intérêt de chaque fournisseur de créer des extensions propriétaires et de faire des optimisations propriétaires pour vendre davantage de son propre matériel. Comme pour toutes les optimisations matérielles, vous devez utiliser des optimisations OpenGL spécifiques aux accélérateurs en sachant que chaque optimisation pour une plate-forme diminue la portabilité et les performances de plusieurs autres. Les optimisations plus générales de Java 3D visent principalement à maximiser la portabilité des applications Java 3D.

  • Alors que les interfaces C vers OpenGL sont omniprésentes, les interfaces Java ne sont pas encore standardisées et ne sont pas largement disponibles

    Le produit Magician d'Arcane Technologies était jusqu'à récemment sur le marché pour changer ce problème de portabilité, mais avec sa disparition, une grande partie de l'histoire multiplateforme pour Java-OpenGL, du moins à l'heure actuelle. Plus d'informations ci-dessous.

  • L'exposition par OpenGL des détails internes du processus de rendu peut considérablement compliquer les programmes graphiques 3D autrement simples

    La puissance et la flexibilité sont au prix de la complexité. Dans les cycles de développement rapide du monde technologique actuel, la complexité est en soi quelque chose à éviter dans la mesure du possible. Le vieil adage sur les bogues est vrai: plus il y a de lignes de code, plus il y a de bogues (en général).

Comme vous pouvez le voir à partir des avantages et des inconvénients des approches basées sur OpenGL, Java-OpenGL est puissant dans de nombreux domaines dans lesquels Java 3D est faible. OpenGL donne aux programmeurs un accès de bas niveau au processus de rendu que Java 3D évite explicitement, et OpenGL est actuellement disponible sur beaucoup plus de plates-formes que Java 3D (Magician mis à part). Mais cette flexibilité a un prix potentiel: les programmeurs ont beaucoup de marge d'optimisation, ce qui signifie au contraire qu'ils ont beaucoup de marge pour tout gâcher. Java 3D a une optimisation plus intégrée et un modèle de programmation plus simple qui peut s'avérer particulièrement utile pour les programmeurs novices en Java, en graphisme 3D ou en programmation graphique en réseau et distribuée.