Les queries objects

Les queries objects permettent d’interroger OpenGL pour obtenir des informations à propos des traitements effectués. Par exemple, les queries objects permetttent de récupérer les nombres d’instances/primitives restant après un occlusion culling dans un geometry shader. On utilise également des tableaux de queries objects pour tester chaque rendu et la technique de conditional rendering pour faire les tests de culling directement sur le GPU.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   // Pour créer des queries objects
   void glGenQueries(GLsizei n, GLuint *ids);
 
   GLuint query;
   GLuint queries_array[20];
   glGenQueries(1, &query);
   glGenQueries(20, query_array);
 
   // Détruire des queries objects
   void glDeleteQueries(GLsizei n, const GLuint *ids);
 
   glDeleteQueries(1, &query);
   glDeleteQueries(20, query_array);
 
   // Lancer la query
   glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);  
       // GL_SAMPLES_PASSED : nombre de pixels écris
       // GL_ANY_SAMPLES_PASSED : true si au moins 1 pixel écris (GL >= 3.3)
       // GL_PRIMITIVES_GENERATED
       // GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN  
       // GL_TIME_ELAPSED : temps d'exécution en nanosecondes
 
   // Arrêter la query
   glEndQuery(GL_SAMPLES_PASSED);
 
   // Récupérer le résultat de la query
   glGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &result);
   glGetQueryObject(query, GL_QUERY_RESULT, &count);
 
   // Conditionnal rendering
   glBeginConditionalRender(query, GL_QUERY_WAIT);  
       // GL_QUERY_WAIT, GL_QUERY_NO_WAIT, GL_QUERY_BY_REGION_WAIT
   glEndConditionalRender();