Một cách tiếp cận khả thi có thể là sử dụng Truy vấn loại trừ phần cứng.
Bạn có thể sử dụng các sự kiện, theo đặc điểm kỹ thuật, Kiểm tra stear được thực hiện trước khi kiểm tra độ sâu và chỉ các đoạn vượt qua kiểm tra độ sâu mới được tính bằng Truy vấn loại trừ.
Một ví dụ đơn giản (không được kiểm tra) sẽ như sau:
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);
Lưu ý rằng lệnh gọi để lấy số lượng mẫu sẽ gọi cưỡng bức tuôn ra đường ống và chờ truy vấn kết thúc. Nếu bạn cần một cách tiếp cận không đồng bộ hơn, bạn có thể truy vấn thời tiết truy vấn tắc được thực hiện hay không bằng cách sử dụng:
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?