Czy tracę / zyskuję wydajność odrzucania pikseli, nawet jeśli nie używam testów głębokości?

22

Kiedy po raz pierwszy szukałem instrukcji odrzucania, znalazłem ekspertów twierdzących, że użycie odrzucenia spowoduje obniżenie wydajności. Powiedzieli, że odrzucenie pikseli zakłóci zdolność GPU do prawidłowego używania zBuffer, ponieważ GPU musi najpierw uruchomić moduł cieniujący fragmenty dla obu obiektów, aby sprawdzić, czy jeden bliżej aparatu jest odrzucony, czy nie. W przypadku gry 2D, nad którą obecnie pracuję, wyłączyłem zarówno test głębokości, jak i zapis głębokości. Rysuję wszystkie obiekty posortowane według ich głębokości i to wszystko, GPU nie musi robić wymyślnych rzeczy. teraz zastanawiam się, czy nadal źle jest odrzucić piksele w moim module cieniującym fragmenty?

Ali1S232
źródło

Odpowiedzi:

20

Sprzęt graficzny może na wczesnym etapie wycinać fragmenty przed obliczeniem ich wartości kolorów (innymi słowy przed uruchomieniem modułu cieniującego fragmenty). W konsekwencji, jeśli użyjesz jakichkolwiek funkcji, które mogłyby na to wpłynąć, takich jak discardtesty alfa lub manipulowanie gl_FragDepthzdolnością sprzętu do wykonania tej optymalizacji, zostanie to zagrożone, ponieważ nie można założyć prawdziwej głębokości fragmentu i należy uruchomić pełny moduł cieniujący.

Jednak to, czy użycie którejkolwiek z tych kompromitujących funkcji ma zauważalny wpływ na wydajność, zależy od sytuacji. Wczesna optymalizacja z może poprawić wydajność, na przykład, jeśli masz bardzo drogie moduły cieniujące fragmenty, ale jeśli koszt twojego potoku jest w cieniowaniu wierzchołków (lub gdzie indziej), nie odniesiesz większego korzyści, w związku z czym możesz nie widzieć lub brak obniżenia wydajności przy użyciu discard.

Całkowite wyłączenie testu głębokości za pośrednictwem interfejsu API powinno również uniemożliwić uruchomienie optymalizacji, ponieważ może to spowodować nieprawidłowe renderowanie scen. W takim przypadku nie powinno mieć znaczenia, z którego korzystasz discard.

Najnowszy sprzęt może wymusić testy (w tym wczesne testy szablonowe) przy użyciu layout(early_fragment_tests)- więcej informacji (i ostrzeżeń) znajduje się na stronie, do której link na początku odpowiedzi.


źródło
3

Jak zawsze w przypadku pytań dotyczących wydajności, najdokładniejszą odpowiedzią jest wypróbowanie go na docelowym sprzęcie i zmierzenie, co się stanie.

W twoim przypadku prawdopodobnie nie jest to złe. W rzeczywistości istnieje szansa, że ​​poprawi wydajność, oszczędzając przepustowość pamięci. Dodają również instrukcje modułu cieniującego, więc nie zawsze jest to poprawa wydajności.

Nawet przy użyciu bufora głębokości, uderzenie wydajności nie zawsze jest bardzo znaczące, jeśli jesteś ostrożny z kolejnością, w której rysujesz.

Istnieje post na blogu pod adresem https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/, który szczegółowo opisuje, w jaki sposób może działać wczesne testowanie głębokości w sprzęcie i jakie mogą być ograniczenia.

Adam
źródło
1
Właściwie po testach myślę, że można bezpiecznie założyć, że ani nie tracę, ani nie zyskuję wydajności, ale szukałem odpowiedzi, która dogłębnie wyjaśni, co i dlaczego się wydarzy.
Ali1S232,