Aller au contenu
Procyx

Java et OpenGl (4.x) [WIP]

Recommended Posts

 Java et OpenGL (4.X)

 

88x31.png

 

Cette œuvre est mise à disposition selon les termes de la Licence Créative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original.


 

- Introduction -

Hey les gens! J’espère que vous allez bien! Aujourd'hui j'ai décidé de vous faire un tutoriel sur les dernières versions de OpenGL (4.x) pour 2 principales raisons:

- Il y a très peu de tutoriels OpenGL en français.

- Sur tout les tutoriels que j'ai pu trouver, très peu traitent de l'OpenGL récent.

Avant toute chose, je tient a préciser que pour suivre correctement ce tutoriel, il vous faudra voir des bases en Java (Bien évidement), des bases en mathématiques, et beaucoup de logique.

Bonne lecture !

 

- Sommaire -

1 > OpenGL, qu'est-ce que c'est?

2 > Introduction

3 > Mise en place

4 >

 

1> OpenGL, qu'est ce que c'est ?

Commençons par le début! Qu'est ce qu'OpenGl ?

OpenGL est une Bibliothèque Graphique Open Source et disponible sur plusieurs langages comme le Java ou le C++ (Bien qu'il soit plus utilisé en C++).

L'avantage d'OpenGL est qu'il peut gérer des Graphisme 2D et 3D grâce à l'utilisation directe de votre carte graphique!

A ce jour et à ma connaissance, il n'y a que DirectX et OpenGL qui proposent cela. Mais le petit plus d'OpenGl, c'est qu'il est multi-platforme!

Pour plus d'informations, vous pouvez consulter la page Wikipedia d'OpenGL ici.

 

2> Introduction

Tout ce qui est dit dans cette partie est valable pour toutes les version d'OpenGL. Cela permet aux débutants de comprendre de quoi il s'agit.

Commençons!

Comment marche OpenGL?

OpenGL utilise des "sommets" (On parlera dans le tutoriel (et partout ailleurs ^^) de "vertices" (Vertex au singulier)) pour géré ses rendus.

Par exemple, voici un cube, avec ses 8 sommet:

Spoiler

cube_matrix.png.82a41293f168ffac46c1d540

Pourquoi y-a t'il des diagonales dessinées sur ton cube :o ?

Bonne remarque! Nous verront cela plus tard.

Avant de vraiment entrer dans le vif du tutoriel, sachez qu'il existe 3 grandes "techniques" pour dessiner avec OpenGL:

- Le mode "immédiat",

- La Display List,

- Les Vertex Buffer Object.

Quelles sont les différences entre ces techniques?

Elles ont toutes au moins un avantage et un inconvénient, c'est à vous de choisir en fonction de vos besoin.

Pour vous aidez à choisir, je vais vous expliquer en quoi elles consistent:

Le mode immédiat vous permet de dessiner ce que vous souhaitez, et surtout, avec une simplicité inégalée par les autres techniques. Cependant, le mode immédiat est aussi la technique le plus lente. En effet, vous ne pourrez pas créer un Jeu 3D / Graphique en mode immédiat car ce dernier va répéter énormément de fois les mêmes fonctions à chaque Frame.

La Display List, est aussi très simple d'utilisation (un poil plus difficile que le mode immédiat quand même), et a des performances déjà nettement meilleures que le mode immédiat. Son fonctionnement revient à ranger des toutes les fonctions du mode immédiat dans une liste et à appeler le tout au moment ou nous souhaitons dessiner (Ce qui diminue le nombre de méthodes appelées à chaque Frame).

Les Vertex Buffer Object sont quant à eux, bien plus complexes à utiliser. En revanche, les performances seront au rendez-vous (Si ils sont bien utilisés ^^). Pour vous expliquer comment marche un VBO, ils faut déjà que vous sachiez comment une simple application dessine sur votre écran:

Pour que votre PC affiche le rendu de l'application, il faut que votre carte graphique prennent les données de l'application, dessine avec ces données, et envoie le tout à l'écran, et ce à chaque Frame!

Avec les VBO, c'est différent... On gagne beaucoup en performances car la carte graphique n'a plus à aller chercher les données sur l'application... Elle les à déjà!

Comment est-ce possible :o ?

A l'initialisation d'un VBO, (ou devrais-je dire à la configuration d'un VBO) on envoie les données dans la mémoire graphique.

La mémoire graphique 0.o ?

Vous savez, le petit nombre que vous regardez toujours quand vous touchez à la config de votre PC:

Spoiler

GPU.PNG.0e5219abaf8d7d2c11c352b53b27623a

  Ca vous dit quelque chose? D'ailleurs, dorénavant quand vous regarderez les spécifications des Cartes Graphiques, vous regarderez le ligne "OpenGL":

Spoiler

Spec.thumb.PNG.20eb145cbbf0b165521bec4d9

Revenons en à nos VBO.

Avec les VBO, c'est aussi un petit peu faux de dire que la Carte Graphique ne fait plus d'aller-retour avec l'application, car c'est l'application qui lui dit ou se situe cette donnée et à quoi sert-elle. Par exemple, imaginons que j'envoie les coordonnés d'un vertex (souvenez-vous) à la carte graphique: 0.0; 1.0.

Au moment de l'affichage, la carte graphique ne peut pas savoir si le 0.0 est une couleur ? le 1.0 une coordonné de texture ? Elle va donc demandé cela à l'application à chaque Frame.

Okey! Mais il n'y a vraiment aucun moyen pour remédier à cela ?

Les VBO seuls sont déjà très performants... Mais bon, si on veut vraiment une optimisation Maximale, les Vertex Array Objects entrent en action!

Encore une autre technique ?

Non, les VBO sont considérés comme une "technique" à part entière car ils peuvent tout faire seuls.

Les VAO permettent encore d'optimiser les performance en réduisant à néant les allez retours entre votre carte graphique et votre application!

En effet, le VAO va se charger d'envoyer à la carte graphique ce à quoi correspondent les données envoyées pas le(s) VBO!

La combinaisons VBO / VAO vous offrira une maximum de performances :D

 

Revenons aux 3 techniques, pour faire une sorte de petit Bilan:

- Le mode immédiat peut être utilisé pour des jeux 2D, relativement statiques (Comme Pac-Man par exemple).

- La Display List peut être utilisé pour des jeux 2D ou des Jeux 3D qui ne sont pas extrêmement lourds graphiquement (Comme Mario Bros sur DS par exemple).

- Les Vertex Buffer Object  peuvent être utiliser pour des jeux 3D demandant beaucoup de ressources.

 

Avant de passer au réel début tu tutoriel, je vais vous expliquer le fonctionnement des "OpenGL Objects":

Les VBO, les VAO, les Textures... toutes ces choses ont un point commun, ce sont des OpenGL Objects.

Tout les OpenGL Object ont au moins 3 méthodes en commun:

- glGenX(),

- glDeleteX(),

- glBindX().

Là ou X = le nom de l'objet.

A quoi servent ces méthodes?

Le 2 premières sont compréhensibles, on génère un objet/on supprime un objet.

La troisième méthode sert à "verrouiller" un objet. En effet, pour savoir sur quel objet vous travaillez, OpenGL à besoin que vous le verrouillez.

Je vais prendre un exemple métaphorique qui représente une voiture comme un objet OpenGL:

// On génère les voitures
final int voitureRouge = glGenVoiture(GL_VOITURE);
final int voitureBleu = glGenVoiture(GL_VOITURE);

// On verrouille la voiture rouge
glBindVoiture(voitureRouge);
// On la modifie
glSetVoitureColor(GL_RED);
glSetVoitureParam(GL_4_ROUES_MOTRICES);

// On verrouille la voiture bleue
glBindVoiture(voitureBleu)
// On la modifie
glSetVoitureColor(GL_BLUE);
glSetVoitureParam(GL_2_ROUES_MOTRICES);

// On deverrouille
glBindVoiture(0);

// Si on a besoin de supprimer les voitures, alors
glDeleteVoiture(voitureRouge);
glDeleteVoiture(voitureBleu);

 

Par cet exemple, vous aurez aussi compris qu'un objet OpenGL est désigné par un Integer (Comme d'ailleurs toutes les actions d'OpenGL).

Nous avons maintenant terminer l'introduction, et nous allons pouvoir passer au tutoriel en lui même!

 

3> Mise en place

 

[WIP¨]

 

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

bon courage pour cette longue aventure qu'est la rédaction d'un gros tuto ! :P

Essaye quand même d'être plus précis dans tes explications, ça aidera beaucoup à la compréhension.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 2 heures , Wytrem said:

Salut,

bon courage pour cette longue aventure qu'est la rédaction d'un gros tuto ! :P

Essaye quand même d'être plus précis dans tes explications, ça aidera beaucoup à la compréhension.

Merci :D Ce n'est que l'introduction :D Tout sera expliquer bien plus précis plus tard :p

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×