Page MenuHomec4science

vue_opengl.cc
No OneTemporary

File Metadata

Created
Wed, Dec 4, 23:15

vue_opengl.cc

#include "vue_opengl.h"
#include "vertex_shader.h" // Identifiants Qt de nos différents attributs
#include "contenu.h"
// ======================================================================
void VueOpenGL::dessine(Contenu const& a_dessiner)
{
Q_UNUSED(a_dessiner); // Dans cet exemple simple, on n'utilise pas le paramètre.
/* Création d'une matrice pour modifier le point de vue. *
* Cette matrice sera appliquée aux 8 sommets du cube. *
* Au départ, la matrice est la matrice identité (constructeur par défaut). */
QMatrix4x4 matrice;
// Multiplie la matrice à droite par une matrice de translation (0, 0, -4).
matrice.translate(0.0, 0.0, -4.0);
// Multiplie la matrice à droite par une matrice de rotation de 60 degrés autour de l'axe Y.
matrice.rotate(60.0, 0.0, 1.0, 0.0);
// Multiplie la matrice à droite par une matrice de rotation de 45 degrés autour de l'axe Z.
matrice.rotate(45.0, 0.0, 0.0, 1.0);
// Dessine le cube
dessineCube(matrice);
}
// ======================================================================
void VueOpenGL::init()
{
/* Initialise notre vue OpenGL.
* Dans cet exemple, nous créons et activons notre shader.
*
* En raison du contenu des fichiers *.glsl, le shader de cet exemple
* NE permet QUE de dessiner des primitives colorées
* (pas de textures, brouillard, reflets de la lumière ou autres).
*
* Il est séparé en deux parties VERTEX et FRAGMENT.
* Le VERTEX :
* - récupère pour chaque sommet des primitives de couleur (dans
* l'attribut couleur) et de position (dans l'attribut sommet)
* - multiplie l'attribut sommet par les matrices 'vue_modele' et
* 'projection' et donne le résultat à OpenGL
* - passe la couleur au shader FRAGMENT.
*
* Le FRAGMENT :
* - applique la couleur qu'on lui donne
*/
prog.addShaderFromSourceFile(QGLShader::Vertex, ":/vertex_shader.glsl");
prog.addShaderFromSourceFile(QGLShader::Fragment, ":/fragment_shader.glsl");
/* Identifie les deux attributs du shader de cet exemple
* (voir vertex_shader.glsl).
*
* L'attribut identifié par 0 est particulier, il permet d'envoyer un
* nouveau "point" à OpenGL
*
* C'est pourquoi il devra obligatoirement être spécifié et en dernier
* (après la couleur dans cet exemple, voir plus bas).
*/
prog.bindAttributeLocation("sommet", SommetId);
prog.bindAttributeLocation("couleur", CouleurId);
// Compilation du shader OpenGL
prog.link();
// Activation du shader
prog.bind();
/* Activation du "Test de profondeur" et du "Back-face culling"
* Le Test de profondeur permet de dessiner un objet à l'arrière-plan
* partielement caché par d'autres objets.
*
* Le Back-face culling consiste à ne dessiner que les face avec ordre
* de déclaration dans le sens trigonométrique.
*/
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
}
// ======================================================================
void VueOpenGL::dessineCube (QMatrix4x4 const& point_de_vue)
{
// Passe la matrice point_de_vue au shader
prog.setUniformValue("vue_modele", point_de_vue);
glBegin(GL_QUADS);
// face coté X = +1
prog.setAttributeValue(CouleurId, 1.0, 0.0, 0.0); // rouge
prog.setAttributeValue(SommetId, +1.0, -1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, +1.0);
prog.setAttributeValue(SommetId, +1.0, -1.0, +1.0);
// face coté X = -1
prog.setAttributeValue(CouleurId, 0.0, 1.0, 0.0); // vert
prog.setAttributeValue(SommetId, -1.0, -1.0, -1.0);
prog.setAttributeValue(SommetId, -1.0, -1.0, +1.0);
prog.setAttributeValue(SommetId, -1.0, +1.0, +1.0);
prog.setAttributeValue(SommetId, -1.0, +1.0, -1.0);
// face coté Y = +1
prog.setAttributeValue(CouleurId, 0.0, 0.0, 1.0); // bleu
prog.setAttributeValue(SommetId, -1.0, +1.0, -1.0);
prog.setAttributeValue(SommetId, -1.0, +1.0, +1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, +1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, -1.0);
// face coté Y = -1
prog.setAttributeValue(CouleurId, 0.0, 1.0, 1.0); // cyan
prog.setAttributeValue(SommetId, -1.0, -1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, -1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, -1.0, +1.0);
prog.setAttributeValue(SommetId, -1.0, -1.0, +1.0);
// face coté Z = +1
prog.setAttributeValue(CouleurId, 1.0, 1.0, 0.0); // jaune
prog.setAttributeValue(SommetId, -1.0, -1.0, +1.0);
prog.setAttributeValue(SommetId, +1.0, -1.0, +1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, +1.0);
prog.setAttributeValue(SommetId, -1.0, +1.0, +1.0);
// face coté Z = -1
prog.setAttributeValue(CouleurId, 1.0, 0.0, 1.0); // magenta
prog.setAttributeValue(SommetId, -1.0, -1.0, -1.0);
prog.setAttributeValue(SommetId, -1.0, +1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, +1.0, -1.0);
prog.setAttributeValue(SommetId, +1.0, -1.0, -1.0);
glEnd();
}

Event Timeline