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