Jednym z możliwych podejść może być użycie kwerendy okluzji sprzętu.
Można skorzystać z faktów, że zgodnie ze specyfikacją Test Wzornika jest wykonywany przed testem głębokości, a tylko fragmenty, które przejdą test głębokości, są liczone przez Zapytanie Okluzji.
Prosty przykład (nie przetestowany) mógłby wyglądać następująco:
GLuint samples_query = 0;
GLuint samples_passed = 0;
glGenQueries(1, &samples_query);
// Initialize your buffers and textures ...
glEnable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
// Set up the values on the stencil buffer ...
// Now we count the fragments that pass the stencil test
glDepthFunc(GL_ALWAYS); // Set up the depth test to always pass
glBeginQuery(GL_SAMPLES_PASSED, samples_query);
// Render your meshes here
glEndQuery(GL_SAMPLES_PASSED);
glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT, &samples_passed);
// samples_passed holds the number of fragments that passed the stencil test (if any)
// Release your resources ...
glDeleteQueries(1, &samples_query);
Zauważ, że wywołanie w celu uzyskania liczby próbek wymusi wymuszenie opróżnienia potoku i czeka na zakończenie zapytania. Jeśli potrzebujesz bardziej asynchronicznego podejścia, możesz zapytać, czy zapytanie dotyczące okluzji jest wykonywane, czy nie, przy użyciu:
GLuint query_done = 0;
glGetQueryObjectuiv(samples_query, GL_QUERY_RESULT_AVAILABLE, &query_done);
if (query_done != 0)
// Your query result is ready
else
// Maybe check the next frame?