Có thể tìm ra có bao nhiêu mảnh vỡ được thực hiện thông qua bài kiểm tra stprint?


11

Tôi có một ứng dụng OpenGL sử dụng các bài kiểm tra stprint khá rộng rãi để hiển thị các hình dạng không đều (hơi giống như một CSG 2 chiều đơn giản ). Nếu tôi có thể tìm ra có bao nhiêu mảnh đã vượt qua bài kiểm tra stprint và thực sự được kết xuất, điều này sẽ rất hữu ích trong việc đơn giản hóa một số tính toán xuống dòng. Cụ thể, nó sẽ cho phép tôi xác định khu vực của hình được hiển thị miễn phí thay vì phải ước tính nó bằng mô phỏng Monte Carlo sau này.

Tôi biết rằng có một khái niệm tương tự cho các nguyên thủy phát ra từ shader hình học, được gọi là phản hồi biến đổi . Tôi muốn biết liệu có tồn tại một khái niệm tương tự cho các đoạn và bài kiểm tra stprint không.


Một giải pháp thô thiển là chỉ cần tô một màu tương phản lên một màu khác thông qua khuôn tô, lưu bộ đệm đó ra và đếm số pixel bị thay đổi.
TheBuzzSaw

Hmm, thông số kỹ thuật cho biết các truy vấn ngẫu nhiên đếm số lượng các đoạn vượt qua bài kiểm tra độ sâu , nhưng ngoài đỉnh đầu tôi không chắc chắn làm thế nào nó tương tác với bài kiểm tra stpson ngay bây giờ.
Chris nói phục hồi Monica

@ChristianRau Dường như chỉ có các đoạn vượt qua các bài kiểm tra độ sâu mới được tính, nhưng các bài kiểm tra stprint, disard và alpha bị bỏ qua.
Maurice Laveaux

2
@ChristianRau và Maurice, thông số ARB_occlusion_query ban đầu nói rõ ràng rằng nó đếm các mẫu vượt qua cả các bài kiểm tra độ sâu stprint, mặc dù. Xem thêm câu hỏi StackOverflow này .
Nathan Reed

@NathanReed Âm thanh như bạn sắp viết câu trả lời.
Chris nói phục hồi Monica

Câu trả lời:


10

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?

2

Nếu điều bạn quan tâm là khu vực, bạn có thể thu nhỏ kích thước bộ đệm cho đến khi bạn đạt được một pixel và suy ra khu vực đó từ màu của nó.

Các bước sẽ là:

  • Sao chép stprint vào một kết cấu, sử dụng một định dạng với độ chính xác đủ.
  • Tải một shader tạo ra màu tỷ lệ với số lượng texels với một màu nhất định.
  • Ping-pong giữa để bộ đệm khung để giảm một nửa kích thước cho đến khi đạt được một pixel.
  • Màu của pixel là tỷ lệ phần trăm của khung nhìn được bao phủ bởi khu vực: chỉ cần nhân nó với diện tích của khung nhìn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.