Одним из возможных подходов может быть использование запроса аппаратного обеспечения окклюзии.
Можно использовать факты, свидетельствующие о том, что по спецификации тест трафарета выполняется перед тестом глубины, и только запрос фрагментов, прошедших тест глубины, учитывается в запросе окклюзии.
Простой пример (не проверенный) будет выглядеть так:
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);
Обратите внимание, что вызов для получения количества выборок вызовет принудительную очистку конвейера и будет ждать завершения запроса. Если вам нужен более асинхронный подход, вы можете запросить, делается ли запрос окклюзии или нет, используя:
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?