gKit2 light
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 }
representation d'un objet / maillage.
Definition: mesh.h:112
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition: mesh.h:296
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:291
void release()
detruit les objets openGL.
Definition: mesh.cpp:62
Context create_context(Window window)
cree et configure un contexte opengl
Definition: window.cpp:356
void release_window(Window window)
destruction de la fenetre.
Definition: window.cpp:325
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
Window create_window(const int w, const int h, const int major, const int minor, const int samples)
creation d'une fenetre pour l'application.
Definition: window.cpp:259
void release_context(Context context)
detruit le contexte openGL.
Definition: window.cpp:422
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition: wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:204
int release_program(const GLuint program)
detruit les shaders et le program.
Definition: program.cpp:211
int init(std::vector< const char * > &options)
Definition: shader_kit.cpp:92
int run(Window window, int(*draw)())
boucle de gestion des evenements de l'application.
Definition: window.cpp:147