W wielu popularnych tytułach AAA (szczególnie gry z silnikiem Source), gdy gracz osiąga obszar „bez wyżywienia”, na przykład poza granicami lub nocowanie pod mapą; na ekranie pojawia się dziwny efekt (rozrywanie bufora?).
Można to opisać jako podobne do śladu okien, które Windows XP może pozostawić podczas przeciągania okna, gdy system się zawiesza.
Mogę jedynie postulować, że programiści nie usuwają bufora kolorów podczas odświeżania ekranu?
Czy to jest poprawne? Jeśli tak, dlaczego?
Odpowiedzi:
Dawno, dawno temu wyczyszczenie buforów koloru i głębokości zabierało dużo czasu. Zrobienie tego oznaczało, że karta graficzna będzie musiała przejść każdy piksel bufora ramki i zapisać do niego wartość.
Z tego powodu twórcy gier stwierdzili, że bardziej efektywne byłoby po prostu założenie, że każdy piksel zostanie zrenderowany. Opracowali wiele technik, aby to zrobić.
Bufor kolorów jest najłatwiejszy do zignorowania. Mniej łatwy jest bufor głębokości, ponieważ zostałby zanieczyszczony starymi danymi. To, co zrobili, było proste.
Na ramie 0, stałoby się z
glDepthRange
(lub ekwiwalent D3D I) (0, 0,5), i ich użyćglDepthFunc
zGL_LESS
(lubGL_LEQUAL
). Oznacza to, że najdalsza wartość głębokości, jaką kiedykolwiek uzyskasz w buforze głębokości, to 0,5. Zatem największa wartość w buforze głębokości na końcu ramki 0 wynosi 0,5 (zakładając, że zapisałeś każdy piksel).W ramce 1 zmieniliby zakres głębokości na (1, 0,5). Zauważ, że w tym przypadku wartość głębokości bliskiej jest większa niż głębokość dalekiej. Ale zmieniliby także funkcję głębokości na
GL_GREATER
(lubGL_GEQUAL
), co odwraca znaczenie testu głębokości. Ponieważ największa wartość w buforze głębokości wynosi 0,5, wszystko, co napiszesz, będzie miało większą wartość . Ponieważ test głębokości został odwrócony, oznacza to, że wszystko, co zostało zapisane w ramce 0, jest teraz dalej niż wszystko, co mogłoby być zapisane w ramce 1. Na końcu ramki 1, najmniejszy wartość w buforze głębokości wynosi teraz 0,5.A potem się powtarzają.
Na każdym sprzęcie wyprodukowanym od około 2003 r. Nie jest to już optymalizacja. Rzeczywiście, jest to optymalizacja negatywna . Wyczyszczenie bufora głębokości przyspiesza sprzęt . Nie naprawdę.
Zasadniczo dzieje się tak, że czyszczenie buforów tak naprawdę nic nie pisze. Przechowują niektóre bity w pamięci podręcznej GPU, które informują system o tym, do jakiego koloru / głębi zostały usunięte. Kiedy system próbuje zapisać do linii bufora ramki, nie zawraca sobie głowy czytaniem, co tam jest, ponieważ już wie, że jest to puste pole o wyraźnej wartości koloru / głębokości. Jeśli spróbujesz połączyć się z tym, co tam jest lub wykonasz test głębokości, znowu nie musisz czytać: wie, jaką wartość należy mieszać / testować z / przeciw.
Więc każdy pierwszy odczyt / modyfikacja / zapis, który wykonujesz w każdej linii pamięci podręcznej po wyczyszczeniu, jest w zasadzie zapisem. Jest za darmo .
Co więcej, posiadanie poszarpanego bufora głębokości może działać przeciwko Hyper-Z / Hierarchial-Z / dowolnej optymalizacji sprzętowej. Tak, twoja scena będzie działać przeciwko tym ostatecznie, gdy dodasz szczegóły. Ale jeśli bufor głębokości jest postrzępiony w porównaniu z poprzednimi renderingami, nawet jeśli te obiekty w tle znajdują się w tle, może to wpłynąć na efektywność technik cullingu. I to nie pomoże wydajności.
Więc nigdy nie powinieneś wykonywać tej techniki odwracania głębi we współczesnych grach.
Uwaga: Jari ma dobrą opinię na temat architektur renderowania opartych na kafelkach (jak w większości platform mobilnych). Nie wyczyszczenie głębokości może również sprawić, że będzie tam nieprzyjemnie.
źródło
Tak, masz rację, że bufor tylny nie jest czyszczony.
Dlaczego, ponieważ (głównie) szybsze jest korzystanie z niestandardowego modułu cieniującego, który pinguje wartości głębokości ping-ponga w przeciwnych kierunkach dla każdej klatki i polega na tym, że gra zawsze renderuje każdy piksel na ekranie.
Dzięki temu przy zerowym koszcie oszczędzasz jeden bufor na klatkę.
źródło