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