Tôi có bị mất / tăng hiệu suất khi loại bỏ pixel ngay cả khi tôi không sử dụng kiểm tra độ sâu không?


22

Khi tôi lần đầu tiên tìm kiếm hướng dẫn loại bỏ, tôi đã tìm thấy các chuyên gia nói rằng sử dụng loại bỏ sẽ dẫn đến hiệu quả. Họ nói rằng việc loại bỏ các pixel sẽ phá vỡ khả năng sử dụng zBuffer của GPU đúng cách vì trước tiên GPU phải chạy Fragment shader cho cả hai đối tượng để kiểm tra xem một camera gần hơn có bị loại bỏ hay không. Đối với trò chơi 2D tôi hiện đang làm việc, tôi đã tắt cả kiểm tra độ sâu và viết sâu. Tôi đang vẽ tất cả các đối tượng được sắp xếp theo độ sâu của chúng và đó là tất cả, không cần GPU để làm những việc ưa thích. Bây giờ tôi đang tự hỏi liệu nó có còn tệ nếu tôi loại bỏ các pixel trong shader mảnh của mình không?

Câu trả lời:


20

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ư discardkiểm tra alpha hoặc thao tác gl_FragDepthkhả 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.


3

Như mọi câu hỏi về hiệu năng, câu trả lời chính xác nhất là dùng thử trên phần cứng mục tiêu của bạn và đo lường điều gì sẽ xảy ra.

Trong trường hợp của bạn, nó có lẽ không phải là một điều xấu để làm. Trong thực tế, có khả năng nó sẽ giúp hiệu suất bằng cách tiết kiệm băng thông bộ nhớ. Nó cũng sẽ thêm các hướng dẫn đổ bóng, vì vậy nó không phải lúc nào cũng là một lợi ích hiệu suất.

Ngay cả khi sử dụng bộ đệm độ sâu, hiệu năng đạt được không phải lúc nào cũng đáng kể, nếu bạn cẩn thận với thứ tự bạn vẽ.

Có một bài đăng blog tại https://fgiesen.wordpress.com/2011/07/08/a-trip-ENC-the-graphics-pipeline-2011-part-7/ mô tả chi tiết cách thức kiểm tra độ sâu sớm có thể hoạt động trong phần cứng, và những hạn chế có thể có.


1
Trên thực tế sau khi thử nghiệm tôi nghĩ thật an toàn khi cho rằng tôi không mất cũng như không đạt được hiệu suất, nhưng tôi đang tìm kiếm một câu trả lời giải thích sâu sắc về những gì và tại sao sẽ xảy ra.
Ali1S 232
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.