Sortowanie obiektów przed renderowaniem

10

Próbuję zaimplementować wykres sceny i we wszystkich artykułach, które napotkałem, jest mowa o sortowaniu obiektów. Aby na przykład posortować obiekty według „materiału”. Teraz, dopóki nie usiadłem i nie zacząłem go wdrażać, uznałem to za coś oczywistego, ponieważ miało to sens. Ale teraz zastanawiam się, co tak naprawdę zmienia sortowanie?

W moim silniku mam menedżera UBO, używam tych do przechowywania danych, które będą współdzielone między programami, w tej chwili, które dotyczą tylko czasu, matryc kamery i projekcji oraz świateł (nie martwię się o zarządzanie, które światła wpływają które obiekty ATM).

Teraz dla każdego modelu muszę zmienić model na mundur macierzy światowej, żadne sortowanie tego nie zmieni. Czy zatem przejście od zmiany tej macierzy do ustawienia materiału dla każdego obiektu jest tak złe?

I niejasno pamiętam czytanie gdzieś, że za każdym razem gdy coś zmienić w rurociągu, to musi się zaczerwieniona i może powodować problemy z wydajnością. Ale dla każdego wezwania do rysowania i tak tworzę model macierzy światowej, więc jaki sens ma kiedykolwiek martwienie się tym?

BTW jest jakaś informacja o tym, czy zmiana munduru i wywołanie glBufferSubData jest droższe (czy mniej).

dreta
źródło
3
Szybka odpowiedź, tak, przejście od zmiany matrycy do ustawiania materiałów dla każdego obiektu jest takie złe. W tym momencie proponuję wybrać się na wycieczkę, aby dowiedzieć się o narzędziach do pomiaru wydajności OpenGL dla Twojej platformy, zanim przejdziesz dalej. Za pomocą narzędzi perf możesz łatwo zmierzyć różne techniki i dowiedzieć się, co najlepiej pasuje do potrzeb twojego renderera. Dodatkowo narzędzia te wystarczą na całą karierę, a ten renderer ... nie tyle ;-)
Patrick Hughes
@PatrickHughes niesamowite, dzięki, na pewno to sprawdzę
dreta

Odpowiedzi:

4

Zdecydowanie chcesz posortować materiały razem. Jeśli możesz, możesz również użyć instancji, aby zgrupować geometrię (np. Jeśli masz X takich samych obiektów).

Sortowanie według głębokości ma również wartość. Musisz sortować od tyłu do przodu w poszukiwaniu obiektów przezroczystych (ignorując kilka zaawansowanych technik, które usuwają tę potrzebę, w ograniczonych okolicznościach).

Wartościowe jest również sortowanie nieprzezroczystych obiektów od przodu do tyłu, ponieważ pozwala to wczesnemu Z na znaczne zmniejszenie narzutu fragmentu sceny.

Sean Middleditch
źródło
3
Zamawianie nieprzezroczystych / przezroczystych obiektów nie jest łatwe w skomplikowanych sytuacjach (do tego stopnia, że ​​jest niemożliwe bez arbitralnych reguł). Możesz również pogrupować według tekstury w tym samym celu, aby zmniejszyć wywołania gl.
Darkwings
Porządkowanie według tekstury jest konieczne do grupowania wywołań i zmniejszania wywołań losowych. Sortowanie nie ma nic wspólnego z redukcją połączeń losujących. Sortowanie ma związek z faktycznym uzyskaniem poprawnego renderowania (w przypadku obiektów przezroczystych) lub w celu zminimalizowania narzutu procesora fragmentów (w przypadku obiektów nieprzezroczystych). Bycie „złożonym” jest problemem, tak, ale tym zarabiają programiści grafiki silnika gier, aby gry można było odtwarzać na sprzęcie towarowym. Wydajność sprzętowa pomiędzy sortowanymi i nieposortowanymi nieprzezroczystymi obiektami może być dość duża.
Sean Middleditch
opengl.org/wiki/Transparency_Sorting Właśnie to miałem na myśli przez „arbitralne reguły”. Nie ma obiektywnego „poprawnego” sortowania złożonych przypadków. O „sortowaniu” i „zamawianiu” PO wyraźnie stwierdził „sortowanie według materiału” (niezależnie od przezroczystości), i miałem na myśli to samo dla tekstury, ponieważ oba cele mają wpływ na wydajność.
Darkwings
Szczerze mówiąc, nigdy nie widziałem, aby takie problemy pojawiały się w prawdziwych grach. Te przykłady tak naprawdę nie odzwierciedlają tego, jak się robi rzeczy, w których obiekty przezroczyste mają na ogół mniej więcej rozmiar mniejszy i mają dość „pudełkowate” granice kolizji, które zapobiegają szalonym nakładaniom. W obu przypadkach fakt, że „jest ciężko”, nie zmienia jego konieczności. Oczywiście również zauważyłem, że grupowanie według materiału jest ważne, i wspomniałem o wystąpieniu, aby przeciwdziałać twierdzeniu „żadne sortowanie nie może pomóc”, więc nie jestem pewien, czy w mojej odpowiedzi jest coś konkretnego.
Sean Middleditch
Słuchaj, komentarz nie oznacza, że ​​znalazłem coś złego w twojej odpowiedzi i nigdy nie powiedziałem „żadne sortowanie nie może pomóc”. Stwierdziłem, że istnieją przypadki, w których nie istnieje obiektywnie poprawne rozwiązanie, więc oczywiście rozwiązanie musi zostać znalezione przy użyciu dowolnych reguł. To są 2 zupełnie inne stwierdzenia.
Darkwings,
3

Sortowanie obiektów według głębokości ma ogromną wartość, szczególnie w przypadku architektury binowania lub architektury renderowania sąsiadująco.

Sortuj ciała stałe od przodu do tyłu, folie od tyłu do przodu.

Podczas renderowania rzeczy najbliższe do kamery i bryły są renderowane jako pierwsze, a wszystko, co zajmuje tę samą przestrzeń, zostanie odrzucone przez wczesne sprawdzenie bufora Z.

Jeśli architektura graficzna ma jakiś bufor hierarchiczny lub bufor o niskiej rozdzielczości, geometria może zostać wyzerowana, nawet zanim cokolwiek zostanie renderowane.

Jari Komppa
źródło