38 if(!GLAD_GL_ARB_indirect_parameters)
40 printf(
"GL_ARB_indirect_parameters ON\n");
44 m_objet.bounds(pmin, pmax);
46 m_camera.lookat(pmin -
Vector(200, 200, 0), pmax +
Vector(200, 200, 0));
49 for(
int y= -15; y <= 15; y++)
50 for(
int x= -15; x <= 15; x++)
52 m_multi_model.push_back(
Translation(x *20, y *20, 0) );
53 m_multi_indirect.push_back( { unsigned(m_objet.vertex_count()), 1, 0, 0} );
58 glGenBuffers(1, &m_indirect_buffer);
59 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
60 glBufferData(GL_DRAW_INDIRECT_BUFFER,
sizeof(
IndirectParam) * m_multi_indirect.size(), &m_multi_indirect.front(), GL_DYNAMIC_DRAW);
63 glGenBuffers(1, &m_model_buffer);
64 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
65 glBufferData(GL_SHADER_STORAGE_BUFFER,
sizeof(
Transform) * m_multi_model.size(), &m_multi_model.front(), GL_DYNAMIC_DRAW);
68 m_vao= m_objet.create_buffers(
false,
false,
false,
false);
71 m_program_direct=
read_program(
"gkit2_tutos/M2/indirect_direct.glsl");
81 glGenQueries(1, &m_time_query);
84 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
88 glEnable(GL_DEPTH_TEST);
113 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
117 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
118 if(mb & SDL_BUTTON(1))
119 m_camera.rotation(mx, my);
120 else if(mb & SDL_BUTTON(3))
122 else if(mb & SDL_BUTTON(2))
126 glBeginQuery(GL_TIME_ELAPSED, m_time_query);
127 std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now();
131 glBindVertexArray(m_vao);
132 glUseProgram(m_program_direct);
134 program_uniform(m_program_direct,
"modelMatrix", m_model);
135 program_uniform(m_program_direct,
"vpMatrix", m_camera.projection(
window_width(),
window_height(), 45) * m_camera.view());
136 program_uniform(m_program_direct,
"viewMatrix", m_camera.view());
139 for(
int i= 0; i < int(m_multi_model.size()); i++)
141 program_uniform(m_program_direct,
"objectMatrix", m_multi_model[i]);
142 glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count());
148 glBindVertexArray(m_vao);
149 glUseProgram(m_program);
152 program_uniform(m_program,
"modelMatrix", m_model);
154 program_uniform(m_program,
"viewMatrix", m_camera.view());
157 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_model_buffer);
158 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
160 glMultiDrawArraysIndirect(m_objet.primitives(), 0, m_multi_indirect.size(), 0);
165 std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
166 long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
168 glEndQuery(GL_TIME_ELAPSED);
172 glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
175 printf(m_console, 0, 0,
"cpu %02dms %03dus", (
int) (cpu_time / 1000000), (
int) ((cpu_time / 1000) % 1000));
176 printf(m_console, 0, 1,
"gpu %02dms %03dus", (
int) (gpu_time / 1000000), (
int) ((gpu_time / 1000) % 1000));
180 printf(
"cpu %02dms %03dus ", (
int) (cpu_time / 1000000), (
int) ((cpu_time / 1000) % 1000));
181 printf(
"gpu %02dms %03dus\n", (
int) (gpu_time / 1000000), (
int) ((gpu_time / 1000) % 1000));
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().