Phần cứng đồ họa có thể thực hiện loại bỏ các mảnh vỡ dựa trên độ sâu sớm trước khi tính toán giá trị màu của chúng (nói cách khác, trước khi chạy shader mảnh của bạn). Do đó, nếu bạn sử dụng bất kỳ tính năng nào có thể ảnh hưởng đến điều đó, chẳng hạn như discard
kiểm tra alpha hoặc thao tác gl_FragDepth
khả năng tối ưu hóa của phần cứng sẽ bị tổn hại do độ sâu thực sự của đoạn có thể được giả định và phải chạy toàn bộ shader.
Việc sử dụng bất kỳ tính năng nào trong số các tính năng thỏa hiệp này có ảnh hưởng hiệu suất có thể quan sát được hay không tùy thuộc vào tình huống. Ví dụ, tối ưu hóa z có thể cải thiện hiệu suất nếu bạn có các shader mảnh rất đắt tiền, nhưng nếu chi phí cho đường ống của bạn nằm trong shader đỉnh (hoặc ở nơi khác) thì nó sẽ không có lợi cho bạn, và do đó bạn có thể thấy ít hoặc không suy giảm hiệu suất bằng cách sử dụng discard
.
Việc vô hiệu hóa kiểm tra độ sâu hoàn toàn thông qua API cũng sẽ ngăn việc tối ưu hóa chạy, vì nó có thể dẫn đến các cảnh được hiển thị không chính xác. Trong trường hợp của bạn, sau đó, bạn không nên sử dụng discard
.
Phần cứng gần đây có thể buộc các bài kiểm tra (bao gồm các bài kiểm tra stprint sớm) bằng cách sử dụng layout(early_fragment_tests)
- có nhiều thông tin hơn (và hãy cẩn thận) về điều này trên trang tôi đã liên kết ở đầu câu trả lời.