gKit2 light
tuto2GL_app.cpp
Go to the documentation of this file.
1 
3 
4 #include <fstream>
5 #include <sstream>
6 #include <string>
7 
8 #include "glcore.h"
9 
10 #include "app.h"
11 
12 
13 /* une application opengl est composee de plusieurs composants :
14 ** version utilisant la classe App
15 
16  1. une fenetre pour voir ce que l'on dessine
17  2. un contexte openGL pour dessiner
18  3. 3 fonctions :
19  init( ) pour creer les objets que l'on veut dessiner,
20  draw( ) pour les afficher / dessiner
21  quit( ) pour detruire les objets openGL crees dans init( ), a la fermeture de l'application
22 
23  ces 3 fonctions sont appelees dans le main.
24 
25  draw( ) est un peu a part, elle est appellee par la fonction run( ) qui traite les evenements clavier, souris, clicks, etc,
26  ca permet de reagir a ces evenements et de modifier / deplacer / animer ce que l'on dessine.
27 
28  le shader sera compile dans init( ), utilise dans draw( ) et detruit a la fin de l'application dans quit( ).
29  */
30 
31 
32 // utilitaire : charger un fichier texte et renvoyer une chaine de caracteres.
33 std::string read( const char *filename )
34 {
35  std::stringbuf source;
36  std::ifstream in(filename);
37  // verifie que le fichier existe
38  if(in.good() == false)
39  printf("[error] loading program '%s'...\n", filename);
40  else
41  printf("loading program '%s'...\n", filename);
42 
43  // lire le fichier, le caractere '\0' ne peut pas se trouver dans le source de shader
44  in.get(source, 0);
45  // renvoyer la chaine de caracteres
46  return source.str();
47 }
48 
49 
50 struct Tuto2GL : public App
51 {
52 public:
53  // identifiants des shaders
54  GLuint vertex_shader;
55  GLuint fragment_shader;
56  // identifiant du shader program
57  GLuint program;
58 
59  // identifiant du vertex array object
60  GLuint vao;
61 
62  // creation de la fenetre et du contexte
63  Tuto2GL( ) : App(1024, 640) {}
64  ~Tuto2GL() {}
65 
66  // creation des objets openGL
67  int init( )
68  {
69  // creer un objet openGL : vertex array object
70  glGenVertexArrays(1, &vao);
71 
72  // charger le source du vertex shader
73  std::string vertex_source= read("tutos/tuto2GL_vertex.glsl");
74  // creer un objet openGL : vertex shader
75  vertex_shader= glCreateShader(GL_VERTEX_SHADER);
76 
77  // preparer les chaines de caracteres pour compiler le shader
78  const char *vertex_strings[]= { vertex_source.c_str() };
79  glShaderSource(vertex_shader, 1, vertex_strings, NULL);
80  // compiler les sources
81  glCompileShader(vertex_shader);
82 
83  // pareil pour le fragment shader
84  std::string fragment_source= read("tutos/tuto2GL_fragment.glsl");
85  fragment_shader= glCreateShader(GL_FRAGMENT_SHADER);
86  const char *fragment_strings[]= { fragment_source.c_str() };
87  glShaderSource(fragment_shader, 1, fragment_strings, NULL);
88  glCompileShader(fragment_shader);
89 
90  // creer le program et linker les 2 shaders
91  program= glCreateProgram();
92  // inclure les 2 shaders dans le program
93  glAttachShader(program, vertex_shader);
94  glAttachShader(program, fragment_shader);
95  // linker les shaders
96  glLinkProgram(program);
97 
98  /* ou, plus court avec les utilitaires de program.h
99  #include "program.h"
100 
101  program= read_program("tuto2GL.glsl");
102  program_print_errors(program);
103  */
104 
105  // verifier que tout c'est bien passe, si les shaders ne se sont pas compiles correctement, le link du program va echouer.
106  GLint status;
107  glGetProgramiv(program, GL_LINK_STATUS, &status);
108  if(status == GL_FALSE)
109  printf("[error] linking pogram...\n");
110 
111  // renvoyer 0 ras, pas d'erreur, sinon renvoyer -1
112  if(status == GL_TRUE)
113  return 0;
114  else
115  return -1;
116  }
117 
118 
119  // destruction des objets openGL
120  int quit( )
121  {
122  glDeleteShader(vertex_shader);
123  glDeleteShader(fragment_shader);
124  glDeleteProgram(program);
125 
126  /* ou
127  release_program(program);
128  */
129 
130  glDeleteVertexArrays(1, &vao);
131  return 0; // ras, pas d'erreur
132  }
133 
134  // affichage
135  int render( )
136  {
137  // effacer la fenetre : copier la couleur par defaut dans tous les pixels de la fenetre
138  glClearColor(0.2, 0.2, 0.2, 1); // definir la couleur par defaut
139  glClear(GL_COLOR_BUFFER_BIT); // "effacer"
140 
141  // configurer le pipeline, selectionner le shader program a utiliser
142  glUseProgram(program);
143 
144  // configurer le pipeline, selectionner le vertex array a utiliser
145  glBindVertexArray(vao);
146 
147  // dessiner 1 triangle, indices gl_VertexID de 0 a 3
148  glDrawArrays(GL_TRIANGLES, 0, 3);
149 
150  return 1; // on continue, renvoyer 0 pour sortir de l'application
151  }
152 };
153 
154 int main( int argc, char **argv )
155 {
156  Tuto2GL tp;
157  tp.run();
158 
159  return 0;
160 }
classe application.
Definition: app.h:20
App(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition: app.cpp:11
int run()
execution de l'application.
Definition: app.cpp:36
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
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition: tuto2GL_app.cpp:67