18 GLuint
read_cubemap(
const int unit,
const char *filename,
const GLenum texel_type = GL_RGBA )
22 if(image.pixels.empty())
25 int w= image.width / 4;
26 int h= image.height / 3;
30 GLenum data_type= GL_UNSIGNED_BYTE;
31 if(image.channels == 3)
38 glGenTextures(1, &texture);
39 glActiveTexture(GL_TEXTURE0 + unit);
40 glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
44 struct {
int x, y; } faces[]= {
53 for(
int i= 0; i < 6; i++)
57 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
59 data_format, data_type, face.data());
63 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
64 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
65 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
66 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
67 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
69 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
72 glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
75 printf(
" cubemap faces %dx%d\n", w, h);
82 Mesh make_grid(
const int n= 10 )
88 for(
int x= 0; x < n; x++)
90 float px= float(x) - float(n)/2 + .5f;
95 for(
int z= 0; z < n; z++)
97 float pz= float(z) - float(n)/2 + .5f;
125 void init_dynamic_cubemap(
const int w,
const int h )
128 glGenTextures(1, &m_texture_cubemap);
129 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
130 for(
int i= 0; i < 6; i++)
132 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
134 GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
138 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
139 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
140 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
141 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
142 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
144 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
147 glGenTextures(1, &m_depth_cubemap);
148 glBindTexture(GL_TEXTURE_CUBE_MAP, m_depth_cubemap);
149 for(
int i= 0; i < 6; i++)
151 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
152 GL_DEPTH_COMPONENT, w, h, 0,
153 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
nullptr);
156 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
159 glGenFramebuffers(1, &m_framebuffer);
160 glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
161 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texture_cubemap, 0);
162 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_cubemap, 0);
164 glBindFramebuffer(GL_FRAMEBUFFER, 0);
172 m_ground= make_grid(20);
174 m_program_render=
read_program(
"tutos/render_cubemap.glsl");
176 m_program_draw=
read_program(
"tutos/draw_cubemap.glsl");
183 m_object.
bounds(pmin, pmax);
187 init_dynamic_cubemap(1024, 1024);
190 glGenVertexArrays(1, &m_vao);
192 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
195 glDepthFunc(GL_LEQUAL);
196 glEnable(GL_DEPTH_TEST);
209 void scene( std::vector<Object>& objects )
215 for(
int i= 0; i < 100; i++)
217 float x= (i % 10 - 4.5) * 4;
218 float z= (i / 10 - 4.5) * 4;
219 float y= std::cos(x * z + offset);
221 objects[i].color=
Color(
White() * std::abs(y));
235 std::vector<Object> objects;
241 glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
242 glViewport(0, 0, 1024, 1024);
245 float black[4]= { 0.6, 0.6, 0.6, 1 };
246 glClearBufferfv(GL_COLOR, 0, black);
249 glClearBufferfv(GL_DEPTH, 0, &one);
265 glBindVertexArray(vao);
267 glUseProgram(m_program_render);
268 int location_mvp= glGetUniformLocation(m_program_render,
"mvpMatrix");
269 int location_model= glGetUniformLocation(m_program_render,
"modelMatrix");
271 for(
int i= 0; i < int(objects.size()); i++)
278 for(
int i= 0; i < 6; i++)
279 mvp[i]= projection * faces[i] * model;
282 glUniformMatrix4fv(location_mvp, 6, GL_TRUE, mvp[0].data());
283 glUniformMatrix4fv(location_model, 1, GL_TRUE, model.
data());
284 glDrawArraysInstanced(GL_TRIANGLES, 0, m_object.
vertex_count(), 6);
288 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
289 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
295 glBindFramebuffer(GL_FRAMEBUFFER, 0);
297 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
300 Point camera_position= viewInv(
Point(0, 0, 0));
305 glUseProgram(m_program);
310 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
314 m_object.
draw(m_program,
true,
false,
true,
false,
false );
317 draw(m_ground,
Identity(), view, projection);
318 for(
int i= 0; i < int(objects.size()); i++)
319 draw(m_cube, objects[i].model, view, projection);
325 glUseProgram(m_program_draw);
326 glBindVertexArray(m_vao);
330 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
333 glDrawArrays(GL_TRIANGLES, 0, 3);
337 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
339 glBindVertexArray(0);
345 reload_program(m_program_render,
"tutos/render_cubemap.glsl");
347 reload_program(m_program_draw,
"tutos/draw_cubemap.glsl");
349 reload_program(m_program,
"tutos/cubemap.glsl");
358 printf(
"screenshot %d\n", calls);
375 glDeleteVertexArrays(1, &m_vao);
377 glDeleteTextures(1, &m_texture_cubemap);
378 glDeleteTextures(1, &m_depth_cubemap);
379 glDeleteFramebuffers(1, &m_framebuffer);
388 GLuint m_program_render;
389 GLuint m_program_draw;
392 GLuint m_texture_cubemap;
393 GLuint m_depth_cubemap;
394 GLuint m_framebuffer;
398 int main(
int argc,
char **argv )
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
int run()
execution de l'application.
representation d'un objet / maillage.
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
GLuint create_buffers(const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
construit les buffers et le vertex array object necessaires pour dessiner l'objet avec openGL....
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
void draw(const GLuint program, const bool use_position, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
dessine l'objet avec un shader program.
int vertex_count() const
renvoie le nombre de sommets.
void release()
detruit les objets openGL.
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Transform view() const
renvoie la transformation vue.
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int window_height()
renvoie la hauteur de la fenetre de l'application.
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
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().
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
int window_width()
renvoie la largeur de la fenetre de l'application.
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
ImageData read_image_data(const char *filename)
charge les donnees d'un fichier png. renvoie une image initialisee par defaut en cas d'echec.
Color Red()
utilitaire. renvoie une couleur rouge.
Color Blue()
utilitaire. renvoie une couleur bleue.
Image flipY(const Image &image)
retourne l'image
Image flipX(const Image &image)
retourne l'image
Color Green()
utilitaire. renvoie une couleur verte.
Image copy(const Image &image, const int xmin, const int ymin, const int width, const int height)
renvoie un bloc de l'image
Color White()
utilitaire. renvoie une couleur blanche.
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Transform Identity()
construit la transformation identite.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Transform Lookat(const Point &from, const Point &to, const Vector &up)
renvoie la matrice representant le placement et l'orientation d'une camera pour observer le point to.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
GLuint read_program(const char *filename, const char *definitions)
void program_uniform(const GLuint program, const char *uniform, const std::vector< unsigned > &v)
affecte un tableau de valeurs a un uniform du shader program.
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
int release_program(const GLuint program)
detruit les shaders et le program.
representation d'une couleur (rgba) transparente ou opaque.
stockage temporaire des donnees d'une image.
representation d'un point 3d.
representation d'un vecteur 3d.
GLuint read_cubemap(const int unit, const char *filename, const GLenum texel_type=GL_RGBA)
charge une image, decoupe les 6 faces et renvoie une texture cubemap.