gKit2 light

- Main Page
- Related Pages
- Modules
- Classes
- Files

- File List
- File Members

tuto3GL.cpp
Go to the documentation of this file.
1
3
4 #include "window.h"
5 #include "program.h"
6 #include "mesh.h"
7 #include "wavefront.h"
8 #include <stdio.h>
9
10
11 // identifiant du shader program
12 GLuint program;
13
14 // identifiant du vertex array object
15 GLuint vao;
16
17
18 int init( )
19 {
20 // charge 12 triangles, soit un cube...
21 Mesh cube= read_mesh("data/flat_bbox.obj");
22 printf(" %d positions\n", cube.vertex_count());
23
24 // compile le shader program, le program est selectionne
25 program= read_program("tutos/tuto3GL.glsl");
26
27 /* affiche les erreurs de compilation des shaders
28 program_print_errors(program);
29 */
30
31 // transfere les 36 positions dans le tableau declare par le vertex shader
32 // etape 1 : recuperer l'identifiant de l'uniform
33 GLint location= glGetUniformLocation(program, "positions"); // uniform vec3 positions[36];
34 // etape 2 : modifier sa valeur
35 glUniform3fv(location, cube.vertex_count(), cube.vertex_buffer());
36
37 // mesh n'est plus necessaire
38 cube.release();
39
40 // creer un vertex array object
41 glGenVertexArrays(1, &vao);
42
43 // etat openGL par defaut
44 glClearColor(0.2, 0.2, 0.2, 1); // definir la couleur par defaut
45 glClearDepth(1.f); // profondeur par defaut
46
47 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
48 glEnable(GL_DEPTH_TEST); // activer le ztest
49
50 return 0;
51 }
52
53 int quit( )
54 {
55 release_program(program);
56 glDeleteVertexArrays(1, &vao);
57 return 0;
58 }
59
60
61 // affichage
62 int draw( )
63 {
64 // effacer la fenetre : copier la couleur par defaut dans tous les pixels de la fenetre
65 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // "effacer"
66
67 // configurer le pipeline, selectionner le vertex array a utiliser
68 glBindVertexArray(vao);
69
70 // configurer le pipeline, selectionner le shader program a utiliser
71 glUseProgram(program);
72
73 // modifier les valeurs des parametres uniforms du shader program
74 GLint location;
75 location= glGetUniformLocation(program, "color"); // declare dans le fragment shader
76 glUniform4f(location, 1, 0.5, 0, 1); // cf fragment shader vec4 color;
77
78 /*
79 modifiez la valeur de time, declare dans le vertex shader pour modifier la position du cube dans le repere du monde,
80 en fonction du temps. vous pouvez utiliser la fonction mod ou modf pour creer un mouvement cyclique
81
82 utilisez la fonction SDL_GetTicks( ), pour connaitre l'heure exprimee en milli secondes
83
84 float time= SDL_GetTicks();
85 location= glGetUniformLocation(program, "time");
86 glUniform1f(location, time);
87 */
88
89 // dessiner 12 triangles, indices gl_VertexID de 0 a 36
90 glDrawArrays(GL_TRIANGLES, 0, 36);
91
92 return 1; // on continue, renvoyer 0 pour sortir de l'application
93 }
94
95
96 int main( int argc, char **argv )
97 {
98 // etape 1 : creer la fenetre
99 Window window= create_window(1024, 640);
100 if(window == NULL)
101 return 1; // erreur lors de la creation de la fenetre ou de l'init de sdl2
102
103 // etape 2 : creer un contexte opengl pour pouvoir dessiner
104 Context context= create_context(window);
105 if(context == NULL)
106 return 1; // erreur lors de la creation du contexte opengl
107
108 // etape 3 : creation des objets
109 if(init() < 0)
110 {
111 printf("[error] init failed.\n");
112 return 1;
113 }
114
115 // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
116 run(window, draw);
117
118 // etape 5 : nettoyage
119 quit();
120 release_context(context);
121 release_window(window);
122 return 0;
123 }
create_context
Context create_context(Window window, const int major, const int minor)
cree et configure un contexte opengl
Definition: window.cpp:252
window.h
Mesh::vertex_buffer
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL...
Definition: mesh.h:195
mesh.h
Mesh
representation d'un objet / maillage.
Definition: mesh.h:88
program.h
draw
void draw(Mesh &m, const Transform &model, const Transform &view, const Transform &projection, const GLuint texture)
applique une texture a la surface de l'objet. ne fonctionne que si les coordonnees de textures sont f...
Definition: draw.cpp:6
Mesh::release
void release()
detruit les objets openGL.
Definition: mesh.cpp:19
create_window
Window create_window(const int w, const int h)
creation d'une fenetre pour l'application.
Definition: window.cpp:186
read_program
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:150
printf
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
wavefront.h
release_program
int release_program(const GLuint program)
detruit les shaders et le program.
Definition: program.cpp:157
release_context
void release_context(Context context)
detruit le contexte openGL.
Definition: window.cpp:306
Mesh::vertex_count
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:190
release_window
void release_window(Window window)
destruction de la fenetre.
Definition: window.cpp:222
run
int run(Window window, int(*draw)(void))
fonction principale. gestion des evenements et appel de la fonction draw de l'application.
read_mesh
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).
Definition: wavefront.cpp:8