gKit2 light
Loading...
Searching...
No Matches
tuto5GL.cpp
Go to the documentation of this file.
1
3
4#include <stdio.h>
5
6#include "window.h"
7#include "vec.h"
8#include "mat.h"
9
10#include "program.h"
11#include "uniforms.h"
12
13#include "mesh.h"
14#include "wavefront.h"
15
16#include "orbiter.h"
17#include "image_io.h"
18
19
20GLuint program;
21
22GLuint texture;
23
24GLuint vao;
25GLuint vertex_buffer;
26GLuint texcoord_buffer;
27int vertex_count;
28
29Orbiter camera;
30
31
32int init( )
33{
34 // etape 1 : shaders
35 program= read_program("gkit2_tutos/tuto5GL.glsl");
36 program_print_errors(program);
37
38 // etape 2 : charger un mesh, (avec des texcoords), vao + vertex buffer
39 Mesh mesh= read_mesh("data/cube.obj");
40 if(mesh.vertex_count() == 0)
41 return -1; // gros probleme, pas de sommets...
42
43 vertex_count= mesh.vertex_count();
44
45 Point pmin, pmax;
46 mesh.bounds(pmin, pmax);
47 camera.lookat(pmin, pmax);
48
49 // vertex format : position + texcoord,
50 // cf tuto4GL_normals.cpp
51 glGenVertexArrays(1, &vao);
52 glBindVertexArray(vao);
53
54 // vertex buffer
55 glGenBuffers(1, &vertex_buffer);
56 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
57 glBufferData(GL_ARRAY_BUFFER, mesh.vertex_buffer_size(), mesh.vertex_buffer(), GL_STATIC_DRAW);
58
59 // configurer l'attribut position, cf declaration dans le vertex shader : in vec3 position;
60 GLint position= glGetAttribLocation(program, "position");
61 if(position < 0)
62 return -1;
63 glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 0, 0);
64 glEnableVertexAttribArray(position);
65
66 // texcoord buffer
67 glGenBuffers(1, &texcoord_buffer);
68 glBindBuffer(GL_ARRAY_BUFFER, texcoord_buffer);
69 glBufferData(GL_ARRAY_BUFFER, mesh.texcoord_buffer_size(), mesh.texcoord_buffer(), GL_STATIC_DRAW);
70
71 // configurer l'attribut texcoord, cf declaration dans le vertex shader : in vec2 texcoord;
72 GLint texcoord= glGetAttribLocation(program, "texcoord");
73 if(texcoord < 0)
74 return -1;
75 glVertexAttribPointer(texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0);
76 glEnableVertexAttribArray(texcoord);
77
78 // nettoyage
79 mesh.release();
80 glBindVertexArray(0);
81 glBindBuffer(GL_ARRAY_BUFFER, 0);
82
83 // etape 3 : texture
84 ImageData image= read_image_data("data/debug2x2red.png");
85
86 GLenum data_format;
87 GLenum data_type= GL_UNSIGNED_BYTE;
88 if(image.channels == 3)
89 data_format= GL_RGB;
90 else // par defaut
91 data_format= GL_RGBA;
92
93 glGenTextures(1, &texture);
94 glBindTexture(GL_TEXTURE_2D, texture);
95
96 glTexImage2D(GL_TEXTURE_2D, 0,
97 GL_RGBA, image.width, image.height, 0,
98 data_format, data_type, image.data());
99
100 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
101
102 // nettoyage
103 glBindTexture(GL_TEXTURE_2D, 0);
104 glUseProgram(0);
105
106 // etat par defaut
107 glClearColor(0.2f, 0.2f, 0.2f, 1);
108 glClearDepthf(1);
109
110 glDepthFunc(GL_LESS);
111 glEnable(GL_DEPTH_TEST);
112
113 glFrontFace(GL_CCW);
114 glCullFace(GL_BACK);
115 glEnable(GL_CULL_FACE);
116 return 0;
117}
118
119int quit( )
120{
121 release_program(program);
122 glDeleteVertexArrays(1, &vao);
123 glDeleteBuffers(1, &vertex_buffer);
124 glDeleteBuffers(1, &texcoord_buffer);
125 glDeleteTextures(1, &texture);
126 return 0;
127}
128
129int draw( )
130{
131 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
132
133#if 1
134 // recupere les mouvements de la souris, utilise directement SDL2
135 int mx, my;
136 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
137
138 // deplace la camera
139 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
140 // tourne autour de l'objet
141 camera.rotation(mx, my);
142
143 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
144 // approche / eloigne l'objet
145 camera.move(mx);
146
147 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
148 // deplace le point de rotation
149 camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
150#endif
151
152 /* config pipeline :
153 vertex array object
154 program
155 uniforms
156 texture
157 */
158
159 glBindVertexArray(vao);
160 glUseProgram(program);
161
162 // recupere le point de vue et la projection de la camera
163 Transform model= Identity();
164 Transform view= camera.view();
165 Transform projection= camera.projection(window_width(), window_height(), 45);
166
167 // compose les matrices pour passer du repere local de l'objet au repere projectif
168 Transform mvp= projection * view * model;
169 program_uniform(program, "mvpMatrix", mvp);
170
171 // texture
172 glBindTexture(GL_TEXTURE_2D, texture);
173
174 // sampler2D declare par le fragment shader
175 GLint location= glGetUniformLocation(program, "texture0");
176 glUniform1i(location, 0);
177 // ou program_uniform(program, "texture0", 0);
178
179 glDrawArrays(GL_TRIANGLES, 0, vertex_count);
180
181 // nettoyage
182 glBindTexture(GL_TEXTURE_2D, 0);
183 glUseProgram(0);
184 glBindVertexArray(0);
185
186 return 1;
187}
188
189
190int main( int argc, char **argv )
191{
192 // etape 1 : creer la fenetre
193 Window window= create_window(1024, 640);
194 if(window == NULL)
195 return 1; // erreur lors de la creation de la fenetre ou de l'init de sdl2
196
197 // etape 2 : creer un contexte opengl pour pouvoir dessiner
198 Context context= create_context(window);
199 if(context == NULL)
200 return 1; // erreur lors de la creation du contexte opengl
201
202 // etape 3 : creation des objets
203 if(init() < 0)
204 {
205 printf("[error] init failed.\n");
206 return 1;
207 }
208
209 // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
210 run(window, draw);
211
212 // etape 5 : nettoyage
213 quit();
214 release_context(context);
215 release_window(window);
216 return 0;
217}
representation d'un objet / maillage.
Definition mesh.h:121
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
Context create_context(Window window)
cree et configure un contexte opengl
Definition window.cpp:358
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
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 window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
ImageData read_image_data(const void *buffer, const unsigned size, const bool flipY)
charge les donnees d'un fichier png stocke en memoire. renvoie une image initialisee par defaut en ca...
Definition image_io.cpp:335
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
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:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240
int init(std::vector< const char * > &options)
stockage temporaire des donnees d'une image.
Definition image_io.h:55
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21