Olası bir yaklaşım, Donanım Oklüzyon Sorgusu'nun kullanılması olabilir.
Spesifikasyona göre, Şablon Testinin derinlik testinden önce yürütüldüğü ve yalnızca derinlik testini geçen parçaların Oklüzyon Sorgusu tarafından sayıldığı gerçeklerini kullanabilirsiniz.
Basit bir örnek (test edilmedi) şöyle olacaktır:
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);
Örnek sayısını alma çağrısının zorla boru hattının sifonunu çağıracağını ve sorgunun bitmesini bekleyeceğini unutmayın. Daha eşzamansız bir yaklaşıma ihtiyacınız varsa, oklüzyon sorgusunun yapılıp yapılmadığını aşağıdakileri kullanarak sorgulayabilirsiniz:
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?