Trong các môi trường "hiện đại", tiện ích mở rộng "Truy vấn loại trừ NV" cung cấp một phương thức để lấy số lượng các đoạn đã vượt qua bài kiểm tra chuyên sâu. Tuy nhiên, trên iPad / iPhone sử dụng OpenGL ES, tiện ích mở rộng không khả dụng.
Cách tiếp cận hiệu quả nhất để thực hiện một hành vi tương tự trong shader mảnh là gì?
Một số ý tưởng của tôi:
Kết xuất đối tượng hoàn toàn bằng màu trắng, sau đó đếm tất cả các màu với nhau bằng cách sử dụng trình đổ bóng hai chiều trong đó đầu tiên là một đường thẳng đứng được hiển thị và với mỗi phân đoạn, trình đổ bóng sẽ tính tổng trên toàn bộ hàng. Sau đó, một đỉnh duy nhất được hiển thị có mảnh tổng hợp tất cả các tổng một phần của lần đầu tiên. Có vẻ không hiệu quả lắm.
Kết xuất đối tượng hoàn toàn bằng màu trắng trên nền đen. Downsample đệ quy, lạm dụng phép nội suy tuyến tính phần cứng giữa các kết cấu cho đến khi ở độ phân giải hợp lý nhỏ. Điều này dẫn đến các mảnh có mức độ thang độ xám tùy thuộc vào số lượng pixel trắng trong khu vực tương ứng của chúng. Điều này thậm chí đủ chính xác?
Sử dụng mipmap và chỉ cần đọc pixel ở cấp độ 1x1. Một lần nữa câu hỏi về độ chính xác và nếu nó thậm chí có thể sử dụng kết cấu không hai sức mạnh.
Vấn đề của các phương pháp này là, đường ống bị đình trệ dẫn đến các vấn đề hiệu suất lớn. Do đó, tôi đang tìm kiếm một cách hiệu quả hơn để thực hiện mục tiêu của mình.
Sử dụng tiện ích mở rộng EXT_OCCLUSION_QUERY_BOOLESE
Apple đã giới thiệu EXT_OCCLUSION_QUERY_BOOLESE trong iOS 5.0 cho iPad 2.
"4.1.6 Occlusion Queries Occlusion queries use query objects to track the number of fragments or samples that pass the depth test. An occlusion query can be started and finished by calling BeginQueryEXT and EndQueryEXT, respectively, with a target of ANY_SAMPLES_PASSED_EXT or ANY_SAMPLES_PASSED_CONSERVATIVE_EXT. When an occlusion query is started with the target ANY_SAMPLES_PASSED_EXT, the samples-boolean state maintained by the GL is set to FALSE. While that occlusion query is active, the samples-boolean state is set to TRUE if any fragment or sample passes the depth test. When the occlusion query finishes, the samples-boolean state of FALSE or TRUE is written to the corresponding query object as the query result value, and the query result for that object is marked as available. If the target of the query is ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, an implementation may choose to use a less precise version of the test which can additionally set the samples-boolean state to TRUE in some other implementation dependent cases."
Câu đầu tiên gợi ý về một hành vi chính xác là những gì tôi đang tìm kiếm: lấy số pixel vượt qua bài kiểm tra độ sâu một cách không đồng bộ mà không mất nhiều hiệu suất. Tuy nhiên, phần còn lại của tài liệu chỉ mô tả cách nhận kết quả boolean.
Có thể khai thác phần mở rộng này để có được số pixel? Phần cứng có hỗ trợ nó để có thể có API ẩn để có quyền truy cập vào số pixel không?
Các tiện ích mở rộng khác có thể khai thác được sẽ là các tính năng gỡ lỗi như số lần trình tạo bóng mảnh được gọi (PSInvocations trong DirectX - không chắc có gì đó có sẵn simila trong OpenGL ES không). Tuy nhiên, điều này cũng sẽ dẫn đến một gian hàng đường ống.