แนวทางที่เป็นไปได้วิธีหนึ่งอาจเป็นการใช้ Hardware Occlusion Query
คุณสามารถใช้ข้อเท็จจริงที่กำหนดรายละเอียดการทดสอบฉลุจะดำเนินการก่อนการทดสอบความลึกและมีเพียงเศษเล็กเศษน้อยที่ผ่านการทดสอบความลึกเท่านั้นที่จะถูกนับโดย Occlusion Query
ตัวอย่างง่ายๆ (ไม่ได้ทดสอบ) จะเป็นเช่น:
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?