Salah satu pendekatan yang mungkin adalah penggunaan Query Occlusion Perangkat Keras.
Anda dapat menggunakan fakta bahwa, berdasarkan spesifikasi, Uji Stensil dieksekusi sebelum uji kedalaman, dan hanya fragmen yang lolos uji kedalaman yang dihitung oleh Query Occlusion.
Contoh sederhana (tidak diuji) akan seperti:
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);
Perhatikan bahwa panggilan untuk mendapatkan jumlah sampel akan memanggil secara paksa flush dari pipeline dan menunggu pertanyaan selesai. Jika Anda memerlukan pendekatan yang lebih asinkron, Anda dapat menanyakan apakah permintaan oklusi selesai atau tidak dengan menggunakan:
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?