Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F94231034
vue_opengl.cc
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Dec 4, 23:15
Size
4 KB
Mime Type
text/x-c
Expires
Fri, Dec 6, 23:15 (2 d)
Engine
blob
Format
Raw Data
Handle
22764913
Attached To
rSYMKIT symkit
vue_opengl.cc
View Options
#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
Log In to Comment