gKit2 light
Toggle main menu visibility
Loading...
Searching...
No Matches
gkit2_tutos
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(
"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
154
int
main(
int
argc,
char
**argv )
155
{
156
Tuto2GL
tp;
157
tp.
run
();
158
159
return
0;
160
}
app.h
App::App
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
App::run
int run()
execution de l'application.
Definition
app.cpp:36
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
Tuto2GL
Definition
tuto2GL_app.cpp:51
Tuto2GL::quit
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition
tuto2GL_app.cpp:120
Tuto2GL::render
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Definition
tuto2GL_app.cpp:135
Tuto2GL::init
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition
tuto2GL_app.cpp:67
Generated on
for gKit2 light by
1.17.0