24 TP( ) :
App(1024, 640, 4, 3) {}
30 m_objet.
bounds(pmin, pmax);
39 glGenQueries(1, &m_time_query);
42 glGenBuffers(1, &m_indirect_buffer);
43 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
45 glBufferData(GL_DRAW_INDIRECT_BUFFER,
sizeof(
unsigned int) * 4 * 25, NULL, GL_STREAM_DRAW);
50 glGenBuffers(1, &m_model_buffer);
52 glBindBuffer(GL_UNIFORM_BUFFER, m_model_buffer);
54 glBufferData(GL_UNIFORM_BUFFER,
sizeof(
Transform) * 25, NULL, GL_STREAM_DRAW);
65 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
69 glEnable(GL_DEPTH_TEST);
76 glDeleteQueries(1, &m_time_query);
77 glDeleteBuffers(1, &m_indirect_buffer);
78 glDeleteBuffers(1, &m_model_buffer);
85 glDeleteTextures(1, &m_texture);
90 int update(
const float time,
const float delta )
98 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
102 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
103 if(mb & SDL_BUTTON(1))
105 else if(mb & SDL_BUTTON(3))
107 else if(mb & SDL_BUTTON(2))
111 glBeginQuery(GL_TIME_ELAPSED, m_time_query);
112 std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now();
116 for(
int y= -2; y <= 2; y++)
117 for(
int x= -2; x <= 2; x++)
120 draw(m_objet, t * m_model, m_camera, m_texture);
129 unsigned int index_count;
130 unsigned int instance_count;
131 unsigned int first_index;
132 unsigned int first_instance;
134 IndirectParam(
const unsigned int count ) : index_count(count), instance_count(1), first_index(0), first_instance(0) {}
137 std::vector<IndirectParam> indirect;
138 indirect.reserve(25);
141 std::vector<Transform> model;
145 for(
int y= -2; y <= 2; y++)
146 for(
int x= -2; x <= 2; x++)
148 model.push_back(
Translation(x *20, y *20, 0) * m_model );
149 indirect.push_back( IndirectParam(m_objet.
vertex_count()) );
153 glBindVertexArray(m_vao);
154 glUseProgram(m_program);
157 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
159 glBufferData(GL_DRAW_INDIRECT_BUFFER,
sizeof(IndirectParam) * indirect.size(), NULL, GL_STREAM_DRAW);
160 glBufferSubData(GL_DRAW_INDIRECT_BUFFER, 0,
sizeof(IndirectParam) * indirect.size(), &indirect.front());
164 glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_model_buffer);
166 glBufferData(GL_UNIFORM_BUFFER,
sizeof(
Transform) * model.size(), NULL, GL_STREAM_DRAW);
167 glBufferSubData(GL_UNIFORM_BUFFER, 0,
sizeof(
Transform) * model.size(), model.front().buffer());
171 GLint location= glGetUniformLocation(m_program,
"model");
172 glUniformMatrix4fv(location, model.size(), GL_TRUE, model.front().buffer());
178 glMultiDrawArraysIndirect(m_objet.primitives(), 0, indirect.size(), 0);
181 std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
182 long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
184 glEndQuery(GL_TIME_ELAPSED);
188 glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
192 printf(m_console, 0, 0,
"cpu %02dms %03dus", (
int) (cpu_time / 1000000), (
int) ((cpu_time / 1000) % 1000));
193 printf(m_console, 0, 1,
"gpu %02dms %03dus", (
int) (gpu_time / 1000000), (
int) ((gpu_time / 1000) % 1000));
198 printf(
"cpu %02dms %03dus ", (
int) (cpu_time / 1000000), (
int) ((cpu_time / 1000) % 1000));
199 printf(
"gpu %02dms %03dus\n", (
int) (gpu_time / 1000000), (
int) ((gpu_time / 1000) % 1000));
205 GLuint m_indirect_buffer;
206 GLuint m_model_buffer;
221 int main(
int argc,
char **argv )
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
Text create_text()
cree une console. a detruire avec release_text( ).
int init()
a deriver pour creer les objets openGL.
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
void release_text(Text &text)
detruit une console.
representation d'un objet / maillage.
void move(const float z)
rapproche / eloigne la camera du centre.
void release_vertex_format(const GLuint vao)
detruit le vertex array vao et les buffers associes, crees par make_vertex_buffer() et make_index_buf...
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
int run()
execution de l'application.
GLuint create_buffers(const bool use_texcoord=true, const bool use_normal=true, const bool use_color=true)
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
void program_uniform(const GLuint program, const char *uniform, const unsigned int v)
affecte une valeur a un uniform du shader program. uint.
void draw(Mesh &m, const Transform &model, const Transform &view, const Transform &projection, const GLuint texture)
applique une texture a la surface de l'objet. ne fonctionne que si les coordonnees de textures sont f...
int quit()
a deriver pour detruire les objets openGL.
Transform view() const
renvoie la transformation vue.
int window_width()
renvoie la largeur de la fenetre de l'application.
representation d'un vecteur 3d.
void release()
detruit les objets openGL.
Transform projection(const float width, const float height, const float fov) const
renvoie la projection reglee pour une image d'aspect width / height, et une ouverture de fov degres...
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
GLuint read_program(const char *filename, const char *definitions)
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
void translation(const float x, const float y)
deplace le centre / le point observe.
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().
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
int window_height()
renvoie la hauteur de la fenetre de l'application.
int release_program(const GLuint program)
detruit les shaders et le program.
representation d'un point 3d.
void clear(Text &text)
efface le contenu de la console.
int vertex_count() const
renvoie le nombre de sommets.
int render()
a deriver pour afficher les objets.
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).