C++ framework for multimedia software like Games
Wed Nov 02 20:54:26 CET 2011
nb comments: 0

Salut :),
pour ma première vraie news, je vais rapidement présenter différentes méthodes de rendu de primitives (mesh) sous OpenGL.
Le but étant de vous faire découvrir OpenGL et que vous ne soyez pas perdu dans les prochaines news, car le moteur 3d se base uniquement sur OpenGL et j'ai l'intention de vous présenter dans le futur différentes techniques utilisées dans 3dNovac.
Évidemment des abstractions OpenGL sont codées sur 3dNovac, mais il est important de savoir comment ça fonctionne.

La méthode directe (La plus simple mais aussi la plus lente !)

Le principe étant de transmettre à la volée sur la carte graphique les données de rendu. en encapsulant les appels OpenGL par deux directives. glBegin() et glEnd() :

glBegin(GL_TRIANGLES);

    glColor3ub
(255,0,0);    glVertex2d(-0.75,-0.75);
    glColor3ub
(0,255,0);    glVertex2d(0,0.75);
    glColor3ub
(0,0,255);    glVertex2d(0.75,-0.75);

glEnd
();

Il est donc très facile de rendre un mesh en utilisant la méthode directe, mais elle est très coûteuse, et c'est surtout dû au fait que l'on envoie les données à la carte graphique à chaque affichage (imaginez un mesh de plusieurs milliers de polygones...). En effet actuellement les cartes graphiques sont très performantes mais la bande passante entre le CPU et le GPU reste très limitée. 

La méthode pseudo directe Avec les DisplayList

Ici on utilise le même système de rendu mais on va demander à OpenGL de compiler et de stocker les instructions pour les rendre plus tard, voyez par vous même :

// A l'initialisation

unsigned int index = glGenLists(1);
glNewList
(index, GL_COMPILE);
glBegin
(GL_TRIANGLES);

    glColor3ub
(255,0,0);    glVertex2d(-0.75,-0.75);
    glColor3ub
(0,255,0);    glVertex2d(0,0.75);
    glColor3ub
(0,0,255);    glVertex2d(0.75,-0.75);

glEnd
();
glEndList
();


// dans la boucle de rendu (généralement limité à 60 fps)
{
    glCalllist
(index); // draw la display list
}

Voila, comme vous pouvez le voir, c'est pas beaucoup plus compliqué que la méthode direct et c'est nettement plus rapide !
Au final, entre les deux appels glNewList() et glEndList() la plupart des appels OpenGL sont sauvegardés, même l'appel à la fonction glCallList(). Il est donc possible de faire appel à d'autres DisplayList dans une même DisplayList et avoir une gestion récursive de rendu. La vraie puissance des DisplayList est leur maniabilité et facilité d'utilisation.
Cependant les DisplayList ont une limite importante : Elles sont static, et pour changer un attribut on sera obligé de la recréer complètement.
On ne pourra donc pas les utiliser pour rendre une animation !

La méthode indirecte Avec les VertexBufferObject et les IndexBufferObject

Ici je ne mettrai pas d'exemple de code (c'est beaucoup plus complexe...)
Mais le principe est de créer une structure de Vertex permettant de définir les données utilisées pour le rendu (coordonnées, coordonnées de texture, couleur, informations d'animations etc...). Puis on construit un tableau de données et on demande à OpenGL de les stocker sur la carte graphique. Et pour le rendu on envoie à OpenGL les informations de rendu (structure des données & co)
Par la suite il sera possible de récupérer et modifier les données envoyées à la carte graphique.
Cette méthode est utilisée dans la plupart des moteurs 3d présents sur le marché, elle a l'avantage d’être peu coûteuse en ressources et d’être relativement maniable notamment pour faire du rendu avancé avec des Shaders.

Dans 3dNovac j'utilise les 2 dernières méthodes. La DisplayList est surtout utilisée pour rendre la GUI (malheureusement encore très moche). VBO/IBO quant à eux sont utilisés pour rendre les mesh 3d avec un système de matériaux permettant de choisir une structure de vertex et de faire le rendu avec des shaders.

Voila maintenant vous connaissez dans les grandes lignes les 3 méthodes de rendu les plus utilisées dans OpenGL.
Dans ma prochaine news je parlerai probablement de mon ancien système d'affichage de textes (utilisé dans le Zappy).
En espérant que cette news vous aura plus... n’hésitez pas à mettre des commentaires !

Author: Ponpon
Comments
Pseudo
Add new comment:
Post
Loading...