gKit2 light
Loading...
Searching...
No Matches
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.
33std::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
50struct Tuto2GL : public App
51{
52public:
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("gkit2_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("gkit2_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
154int main( int argc, char **argv )
155{
156 Tuto2GL tp;
157 tp.run();
158
159 return 0;
160}
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.