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