एक संभावित दृष्टिकोण हार्डवेयर ऑक्यूपेशन क्वेरी का उपयोग हो सकता है।
आप उन तथ्यों का उपयोग कर सकते हैं जो विनिर्देशन द्वारा, स्टैंसिल टेस्ट को गहराई परीक्षण से पहले निष्पादित किया जाता है, और केवल गहराई परीक्षण पास करने वाले टुकड़ों को अपवाद क्वेरी द्वारा गिना जाता है।
एक सरल उदाहरण (परीक्षण नहीं किया गया) होगा:
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?