1/5

1. Bibliothèque de code

3d scene

Dans la suite des exercices, vous disposez d’une bibliothèque de code (appelée VCL: Visual Computing Library) vous permettant de développer des applications en OpenGL sans avoir à tout recoder à partir de zéro.

La bibliothèque propose un ensemble de fonctionalité basique pour faciliter la programmation 3D tels que

  • Des vecteurs et matrices (2D, 3D, 4D) - en partie similaires à celles disponible en GLSL

  • Des structures de maillages prêtent à être affichées avec OpenGL, ainsi que les shaders associées

  • Des controleurs de scène 3D tel qu’une caméra controlable à la souris.

L’objectif de cette bibliothèque est d’être aussi légère que possible afin de vous permettre de développer plus aisément, tout en restant très proche du code OpenGL basique (sans états cachées). Bien que cela ne soit pas nécessaire, vous devriez être en mesure de comprendre l’ensemble des parties du code, qui est développé suivant les principes suivants

  • Code écrit de manière minimaliste, afin d’être simple à comprendre (pas nécessairement le plus générique ou efficace).

  • Objets écrits pour être légers et sans états cachés. Vous pouvez généralement modifier directement les attributs des objets.

  • La bibliothèque n’impose pas de "framework" de rendu, ainsi le code et les fonctionalitées restent proche d’un développement C++/OpenGL à partir de rien, et il est possible de réaliser des appels directs à OpenGL sans l’aide de la bibliothèque.

Rem. La bibliothèque est développée pour vos TD, il ne s’agit pas d’une bibliothèque standard.

Téléchargement et lancement de la bibliothèque

  • Lien de téléchargement de l’archive de code

  • Compilez et exécutez le code. Vous devriez voir apparaitre une scène 3D avec un quadrangle.

  • Un modèle de caméra manipulable à la souris/clavier est déjà implémenté. Il permet

    • Rotation: clic gauche + déplacement de la souris (modèle de trackball par défaut)

    • Zoom: clic droit + déplacement haut/bas de la souris

    • Panning (/translation dans le plan de la caméra): CTRL + clic gauche + déplacement de souris

    • Avance/Recule (/translation dans le plan orthogonal à la caméra): CTRL + clic droit + déplacement haut/bas de la souris

Structure générale du code

Role des principaux répertoires

  • src/ Contient le code source de la bibliothèque ainsi que le code associé aux exercices.

  • shaders/ Contient les shaders en GLSL

  • external/ Contient du code de bibliothèques externes utilisées par VCL tel que glad (OpenGL loader), imgui (GUI), lodepng (chargeur d’images png).

Le répertoire src/ contient lui même des sous répertoires

  • src/exercises/ Contient le code des exercices. Vous allez principalement ajouter votre propre code dans ces fichiers.

  • src/vcl/ Contient le code source de la bibliothèque VCL.

  • src/main.cpp Contient la fonction main. Décrit les appels principaux du programme, initialise les bibliothèques externes, charge les données et lance la boucle d’animation.

  • src/exercise_current.hpp Indique quelle exercice est actuellement compilé.

Bibliothèque VCL

Le code source de la bibliothèque VCL est organisé de la manière suivante

  • vcl/core/ Contient le coeur indépendant du code de VCL, lui même scindé en sous-répertoires.

    • vcl/core/math/ défini les fonctions et structures d’aide mathématiques tels que les vecteurs et matrices (2D, 3D, 4D).

    • vcl/core/opengl/ contient les objets et fonctions facilitant l’utilisation les appels OpenGL

    • vcl/core/shape/ gère les formes 3D tels que les maillages (éléments stockés en mémoire centrale)

    • vcl/core/drawable/ gère les formes affichables par OpenGL (éléments stockés en mémoire du GPU).

    • vcl/core/scene/ gère les objets non-géométriques utilisés dans la scène (caméra, timers, etc)

    • vcl/core/helper/ fonctions d’aide générales (gestion de string, lecture fichiers, etc).

  • vcl/external_lib/ contient les wrapper permettant d’interfacer les structures VCL avec les bibliothèques externes (glfw, imgui, lodepng, etc).

Remarque sur l’éditeur de code

  • La bibliothèque contient de multiples fichiers, assurez vous que vous soyez capable d’utiliser votre éditeur de code ou IDE de manière à naviguer efficacement entre ces fichiers et à pouvoir passer rapidement de l’utilisation d’une fonction ou objet à sa signature et à son code.

  • Si vous n’êtes pas déjà habitué à un éditeur de code C++ , vous pouvez tester QtCreator (disponible sur les PC de l’école). QtCreator est un IDE C++ capable de charger un projet complet à partir de la lecture d’un fichier CMakeLists.txt (non invasif pour le reste du code), et propose de manière native la complétion de code.

qtcreator

  • Notez que le code doit être exécuté depuis la racine de du dossier. Vous devez paramétrer le run setting (ou run directory) de l’IDE afin de pouvoir exécuter le programme depuis celui-ci.

Utilisation de la bibliothèque

  • Observez le fichier main.cpp, vous devriez reconaitre l’organisation générale du programme, avec, en particulier le lancement de la boucle d’animation. Notez les appels à exercise.setup_data et exercise.frame_draw que vous compléterez dans les exercices par la suite.

  • Observez le fichier exercises/00_introduction/. Chaque exercice possède l’organisation suivante: Un objet scene_exercise est défini, et implémente (au minimum) les méthodes setup_data et frame_draw. scene_exercise est un objet dérivé de base_scene_exercise qui décrit la signature (et un corps vide) de différentes fonctions potentiellement utilisées depuis le programme principal. Chaque objet scene_exercise peut gérer une structure interne qui lui est propre et s’adapter en fonction du type de scène.

Affichage "wireframe"

  • Observez que l’affichage de la forme du quadrangle nécessite l’indication du shader (les shaders basiques sont lus en début de programme). Ajoutez l’affichage suivant dans la fonction frame_draw

surface.draw(shaders["wireframe"], scene.camera);

Notez qu’après exécution du nouveau programme, vous pouvez visualiser les arêtes des triangles associés au maillage.

Note. Il sera conseillé d’observer régulièrement l’organisation de vos triangles lorsque vous créerez des formes. L’une des approches possibles consiste à utiliser le shader affichant ces triangles sous formes de lignes.

Ajout d’une primitive

Ajoutez l’affichage d’une sphère dans la scène. Pour cela, on procèdera de la manière suivante

  • Ajoutez la déclaraction d’une structure vcl::mesh_drawable sphere; dans la déclaration de scene_exercise (fichier introduction.hpp)

  • Ajoutez la création d’une sphère, ainsi que sa conversion en mesh_drawable dans la fonction setup_data

// Create a mesh approximating a sphere (unit radius by default)
mesh sphere_cpu = mesh_primitive_sphere(); // mesh_primitive_sphere is a helper function (several primitive are available)
// Send sphere_cpu data onto GPU
sphere = mesh_drawable(sphere_cpu);
// Set uniform parameter of the sphere
sphere.uniform_parameter.color = {1,0,0};                  //red sphere
sphere.uniform_parameter.translation = {-0.1f,0.5f,0.25f}; // translate sphere display
sphere.uniform_parameter.scaling = 0.1f;                   // scale the sphere to new radius for its display
  • Ajoutez l’appel à l’affichage de la sphère dans frame_draw

sphere.draw(shaders["mesh"], scene.camera);

Note. Il n’est pas nécessaire de stocker de structure intermédiaire (mesh) lors de la création de la sphère, ni d’appeler explicitement le constructeur de mesh_drawable. Ainsi, la création de la sphère sous la forme mesh_drawable peut se faire par l’appel direct

sphere = mesh_primitive_sphere();

Dans ce cas, le constructeur de mesh_drawable est implicitement appelé à partir d’un objet de type mesh.