W jaki sposób nowoczesne silniki gier osiągają rendering w czasie rzeczywistym w porównaniu do „powolnego” renderowania Blendera?

90

Jestem nowy zarówno w gamedev, jak i Blender, i jest coś, czego nie mogę się trząść:

W Blenderze pojedynczy rendering (nawet przy użyciu bardziej zaawansowanego renderera cykli) może potrwać do 45 sekund na moim komputerze. Ale oczywiście w grze możesz mieć niesamowitą grafikę, więc renderowanie odbywa się oczywiście w sposób ciągły, wiele razy na sekundę w czasie rzeczywistym.

Zastanawiam się również, czym jest rozłączność, jeśli chodzi o to, jak „wolne” renderowanie Blendera wydaje się w porównaniu do tego, w jaki sposób silniki gier osiągają renderowanie w czasie rzeczywistym (lub prawie w czasie rzeczywistym).

smeeb
źródło
3
Renderowanie w czasie rzeczywistym jest samo w sobie ogromnym tematem, napisano o nim wiele książek (w tym „Rendering w czasie rzeczywistym”). A rendery, takie jak Cykle, działają zupełnie inaczej niż renderery 3D w silnikach gier - nie można ich tak naprawdę porównać
UnholySheep
42
@UnholySheep Oczywiście możesz je porównać. Jak inaczej ktoś mógłby wyjaśnić różnicę, aby odpowiedzieć na pytanie?
user985366
2
@ 10Replies Ale to pytanie nie byłoby aktualne na tej stronie.
GiantCowFilms
3
@ 10 Odpowiedzi: Podczas gdy OP wspomina o Blenderze, pytanie zasadniczo sprowadza się do tego, dlaczego silniki gier w czasie rzeczywistym wydają się renderować sceny 3D szybciej niż w przybliżeniu foto-realistyczne rendery 3D (takie jak Blender, ale także wiele innych). Zauważ, że na to pytanie odpowiada również odpowiedź zaakceptowana. Mając to na uwadze, zgadzam się, że pytanie jest bardziej na ten temat na temat tworzenia gier , gdzie można zadawać pytania dotyczące ogólnej technologii tworzenia gier, a nie na Blenderze , gdzie pytania są bardziej specyficzne dla Blendera.
LUB Mapper
3
Myślę, że sekret polega na tym, że niesamowite nie musi być precyzyjne. Istnieją szybkie przybliżenia matematyki stosowanej w renderowaniu 3D, takie jak InvSqrt
Dmitry Grigoryev

Odpowiedzi:

115

Renderowanie w czasie rzeczywistym, nawet nowoczesne renderowanie w czasie rzeczywistym, to chwyt sztuczek, skrótów, hacków i przybliżeń.

Weźmy na przykład cienie.

Nadal nie mamy w pełni dokładnego i niezawodnego mechanizmu renderowania cieni w czasie rzeczywistym z dowolnej liczby świateł i dowolnie złożonych obiektów. Mamy wiele wariantów technik mapowania cieni, ale wszystkie one cierpią z powodu dobrze znanych problemów z mapami cieni, a nawet „poprawki” dla nich są tak naprawdę tylko zbiorem obejść i kompromisów (z reguły jeśli widzisz terminy „odchylenie głębi” lub „przesunięcie wielokąta” w czymkolwiek, to nie jest to solidna technika).

Innym przykładem techniki stosowanej przez renderery w czasie rzeczywistym jest wstępne obliczanie. Jeśli coś (np. Oświetlenie) jest zbyt wolne, aby obliczyć w czasie rzeczywistym (i może to zależeć od używanego systemu oświetlenia), możemy to wstępnie obliczyć i zapisać, a następnie możemy użyć wstępnie obliczonych danych w czasie rzeczywistym - czas na zwiększenie wydajności, które często odbywa się kosztem efektów dynamicznych. Jest to zwykła kompromis między pamięcią a obliczeniami: pamięć jest często tania i obfita, obliczenia często nie, więc spalamy dodatkową pamięć w zamian za oszczędność na obliczeniach.

Z kolei renderery offline i narzędzia do modelowania skupiają się bardziej na poprawności i jakości. Ponadto, ponieważ pracują z dynamicznie zmieniającą się geometrią (taką jak budowany model), muszą często przeliczać rzeczy, podczas gdy renderer w czasie rzeczywistym działałby z ostateczną wersją, która nie ma tego wymagania.

Maximus Minimus
źródło
14
Inną kwestią, o której należy wspomnieć, jest to, że ilość obliczeń użytych do wygenerowania wszystkich danych, które gra będzie musiała szybko renderować widoki obszaru, może być o rząd wielkości większa niż ilość obliczeń, które byłyby wymagane do renderowania jednego widoku. Jeśli renderowanie widoków obszaru zajmie jedną sekundę bez wstępnego obliczenia, ale niektóre wstępnie obliczone dane mogą skrócić to do 1/100 sekundy, poświęcenie 20 minut na wstępne obliczenia może być przydatne, jeśli widoki będą potrzebne w grze w czasie rzeczywistym, ale jeśli jeden chce tylko dziesięciosekundowego filmu 24 klatek na sekundę, byłoby o wiele szybciej spędzić cztery minuty ...
supercat
9
... generowanie 240 wymaganych wyświetleń z szybkością jednego na sekundę.
supercat
@supercat iz tego powodu twoje rendery są w zasadzie wolne od pośpiechu i zyskujesz dużą kontrolę nad procesem. Możesz użyć silnika gry do renderowania ... jeśli będziesz gotowy poświęcić się funkcjami. Ale jak powiedziałeś, nie warto.
joojaa
Jednym z uderzających przykładów, które mogę sobie przypomnieć, jest oryginalny silnik Quake (~ 1996), który był w stanie osiągnąć stosunkowo oszałamiającą grafikę 3D w czasie rzeczywistym na bardzo ograniczonych maszynach, stosując kombinacje niezwykle czasochłonnych technik obliczeń wstępnych. Drzewa BSP i wstępnie renderowane efekty świetlne zostały wygenerowane z wyprzedzeniem; zaprojektowanie poziomu dla tego silnika zwykle wymagało godzin (zwykle z dnia na dzień) oczekiwania na narzędzia do kompilacji map. Kompromis polegał zasadniczo na skróceniu czasu renderowania kosztem czasu tworzenia.
Jason C
(Oryginalny silnik Dooma [1993] miał podobne obliczenia wstępne. Może i Maraton , ale nie pamiętam, pamiętam budowanie poziomów Maratonu, ale nie pamiętam, co było zaangażowane.)
Jason C
109

Obecna odpowiedź bardzo dobrze wyjaśniła ogólne związane z tym problemy, ale wydaje mi się, że brakuje w niej ważnego szczegółu technicznego: silnik renderujący „Cykle” Blendera jest innym rodzajem silnika niż to, z którego korzysta większość gier.

Zazwyczaj gry są renderowane poprzez iterowanie wszystkich wielokątów w scenie i rysowanie ich indywidualnie. Odbywa się to poprzez „rzutowanie” współrzędnych wielokąta przez wirtualną kamerę w celu uzyskania płaskiego obrazu. Technika ta jest wykorzystywana w grach, ponieważ nowoczesny sprzęt jest zaprojektowany wokół tej techniki i można ją wykonywać w czasie rzeczywistym przy stosunkowo wysokim poziomie szczegółowości. Zainteresowanie tą techniką zastosował również poprzedni silnik renderujący Blendera, zanim Blender Foundation zrzuciła stary silnik na rzecz silnika Cycles.

Renderowanie wielokątów

Z drugiej strony cykle to tak zwany silnik raytracingu. Zamiast patrzeć na wielokąty i renderować je indywidualnie, rzuca wirtualne promienie światła na scenę (jeden na każdy piksel na końcowym obrazie), odbija tę wiązkę światła od kilku powierzchni, a następnie wykorzystuje te dane, aby zdecydować, jaki kolor ma piksel Powinien być. Raytracing to bardzo kosztowna obliczeniowo technika, która sprawia, że ​​jest niepraktyczny do renderowania w czasie rzeczywistym, ale jest używany do renderowania obrazów i filmów, ponieważ zapewnia dodatkowy poziom szczegółowości i realizmu.

Renderowanie Raytracing


Proszę zauważyć, że moje krótkie opisy raytracingu i renderowania wielokątów są bardzo uproszczone ze względu na zwięzłość. Jeśli chcesz dowiedzieć się więcej o technikach, zalecamy skorzystanie z dogłębnego samouczka lub książki, ponieważ podejrzewam, że jest bardzo wielu ludzi, którzy napisali lepsze wyjaśnienia, niż mogłem zebrać.

Należy również pamiętać, że istnieje wiele technik renderowania 3D, a niektóre gry faktycznie używają odmian raytracku do niektórych celów.

Pharap
źródło
3
+1 za bardzo dobry punkt; Celowo nie poszedłem do króliczej dziury raytracingu w porównaniu z rasteryzacją, więc wspaniale jest mieć to jako uzupełnienie.
Maximus Minimus
16
Ta odpowiedź trafia do sedna różnicy. Silniki gier wykonują rasteryzację (do przodu lub odroczoną), a renderery offline (takie jak Blender, Renderman itp.) Wykonują śledzenie promieni. Dwa zupełnie różne podejścia do rysowania obrazu.
sprzedano
4
@ LeComteduMerde-fou Ponieważ gamedev jest skierowany do twórców gier, czułem, że dodatkowe wyjaśnienia techniczne przyniosą korzyść bardziej technicznie skłonnym czytelnikom.
Pharap
1
@ssell Prawda, ale nie chodzi tylko o śledzenie promieni - nawet bez śledzenia promieni, nawet przy renderowaniu za pomocą GPU, renderowanie Blendera jest zwykle znacznie bardziej szczegółowe i wolniejsze. Ma to głównie związek z naciskiem na poprawność - lepsze filtrowanie i rozdzielczość tekstur, wygładzanie krawędzi, oświetlenie, mapowanie cieni, dokładność Z, quady, powierzchnie dwukierunkowe, duża liczba wielokątów, wyjście w wyższej rozdzielczości, dokładne mapowanie wypukłości , brak wstępnie obliczonych map, morfing, dokładna kinematyka ... to długa lista funkcji, których brakuje w silnikach gier lub które udają.
Luaan
1
@Chii źle zapamiętałem. Myślałem o ART VPS , to było po prostu przyspieszenie, a nie czas rzeczywisty.
Jason C