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(); |