Autor Wątek: Unlimited Detail  (Przeczytany 10599 razy)

Offline MrKaktus

  • Użytkownik

# Sierpień 02, 2011, 09:01:44
A racja chyba Jon Olick.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 09:01:56
Cytuj
O ile pamiętam Carmack chce zastosować raycasting (ten pomysł pojawił się dość wcześnie), szczerze mówiąc nie do końca rozumiem dlaczego (czyżby ze względu na architekturę?).
Raycasting pozwala Ci na przechodzenie przez OctTree w jego surowej postaci (które można streamować z dysku jak megatekstury zgodnie z potrzebami). Rasteryzacja na to juz tak łatwo nie pozwala.

Offline puchacz-I

  • Użytkownik

# Sierpień 02, 2011, 12:22:34
Jeśli dobrze zrozumiałem decydujący jest tutaj fakt, iż raycasting pozwala określić które części sceny mogą być widoczne (dzięki czemu możemy je załadować). Jeśli tak to mogę przedstawić technikę która posiada tą cechę (rasteryzacja z automatycznym occlusion cullingiem) dodatkowo jest szybsza od raycastingu (złożoność liniowa) i pozwala na bardzo prostą realizacje półprzezroczystości.

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 13:00:25
Cytuj
Jeśli tak to mogę przedstawić technikę która posiada tą cechę (rasteryzacja z automatycznym occlusion cullingiem) dodatkowo jest szybsza od raycastingu (złożoność liniowa) i pozwala na bardzo prostą realizacje półprzezroczystości.
OK, przedstawiaj. Półprzezroczystość możesz odpuścić. Bardzo zastanawia mnie za to to, w jaki sposób chcesz jasno określić, które komórki wymagają większego LOD, a które nie są aż tak potrzebne przy użyciu occlusion cullingu przy zachowaniu rozsądnych ograniczeń liczby DIPów w klatce.

Offline puchacz-I

  • Użytkownik

# Sierpień 02, 2011, 14:17:26
Scena jest zapisana w postaci drzewa kd, oct (SVO), BSP dla obiektów statycznych i BVH dla obiektów dynamicznych. Dalej skupie się raczej na scenach statycznych. Bufor ramki dodatkowo (poza kolorem etc.) zawiera hierarchiczny bufor widoczności. Każda komórka bufora przechowuje jeden bajt danych (uint8) w którym wykorzystane są 3 bity (liczba zarysowanych dzieci - 4 odpowiada zarysowaniu węzła). Liście bufora odpowiadają pikselom obrazu. Każdy węzeł (poza liśćmi) posiada dzieci (4) i przechowuje stan zarysowany tylko w przypadku gdy wszystkie jego dzieci posiadają ten stan.

Algorytm wyglada następująco:
Znajdujemy się w pewnym węźle (na początku w korzeniu)
- sprawdzamy widoczność węzła, wykorzystujemy do tego bufor widoczności
jeśli nie jest widoczny wracamy do rodzica
jeśli jest widoczny:
 - określamy poziom LOD (porównując wielkość węzła (rzutowanie bboxa na ekran) do wielkości piksela)
 jeśli jest zbyt niski
 - przechodzimy głębiej - sortujemy dzieci w kolejności od najbliższego kamery i kolejno przechodzimy do nich powtarzając algorytm
 jeśli jest odpowiedni lub znajdujemy się w liściu
 - rysujemy voxel, ustawiamy w buforze widoczności stan piksela na zarysowany
 - inkrementujemy licznik rodzica
 - wracamy do rodzica

Tak to wygląda w dużym uproszczeniu...

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 14:27:21
Nie zrozumiałeś mnie: pytaniem jest, jak chcesz to zrobić na GPU?

Offline puchacz-I

  • Użytkownik

# Sierpień 02, 2011, 14:39:19
Wolałbym nie robić tego na GPU ;]

Edit:
Jedyne co przychodzi do głowy to właśnie zoptymalizowany raycasting lub raytracing. Trzeba wykorzystać fakt, iż dla pobliskich pikseli przechodzimy przez tą sama część drzewa (przez co zbliżyć się do złożoności liniowej).
« Ostatnia zmiana: Sierpień 02, 2011, 14:50:22 wysłana przez puchacz-I »

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 16:58:31
Cytuj
Wolałbym nie robić tego na GPU ;]
I z miejsca skazać się na wydajność do bani?

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Sierpień 02, 2011, 17:36:44
Do bani?
Poprzednie prezentacje miały działać podobno na jednym rdzeniu cpu z zegarem 3GHz (jaki tym nie wiem).

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 17:39:19
Cytuj
Do bani?
Poprzednie prezentacje miały działać podobno na jednym rdzeniu cpu z zegarem 3GHz (jaki tym nie wiem).
Plus GPU do tego?

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Sierpień 02, 2011, 17:41:19
No właśnie sęk w tym że samo CPU

Cytat: http://www.somedude.net/gamemonkey/forum/viewtopic.php?f=12&t=419
I'd like to mention Unlimited Detail, a technology developed by Bruce Dell, which does in fact do exactly what he claims it does... Render incredibly detailed 3D scenes at interactive frame rates... without 3D hardware acceleration. It accomplishes this using a novel traversal of a octree style data structure. The effect is perfect occlusion without retracing tree nodes. The result is tremendous efficiency.

I have seen the system in action and I have seen the C++ source code of his inner loop. What is more impressive is that the core algorithm does not need complex math instructions like square root or trig, in fact it does not use floating point instructions or do multiplies and divides!
« Ostatnia zmiana: Sierpień 02, 2011, 17:48:29 wysłana przez świrus »

Offline puchacz-I

  • Użytkownik

# Sierpień 02, 2011, 17:52:24
Krzysiek: Z wydajnością nie będzie tak źle. Ilość obliczeń nie jest tak duża ze względu na niewielka złożoność algorytmu. Przepustowość RAM<->CPU też jest minimalna - proporcjonalna do wielkości obrazu (dzięki niemal idealnemu cullingowi i LoD). Lokalność odwołań jest także zachowana (warto zrezygnować z odrzucania na niskim poziomie). Na GPU można przenieść oświetlenie czy nawet filtrowanie (najbardziej wymagające elementy, bardzo proste do zrównoleglenia).

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 18:21:40
No to jak tak, to ja nie widzę problemu: robisz sobie na CPU G-bufor, który oświetlasz na GPU. Dobre zwłaszcza na konsolach, gdzie masz zunifikowaną przestrzeń adresową CPU i GPU (chociaż konieczność posiadania dwóch G-buforów może tam rozmiarowo zaboleć).

Offline puchacz-I

  • Użytkownik

# Sierpień 02, 2011, 19:27:51
Można też zapisywać do liniowego bufora gdzie każdy element poza podstawowymi własnościami piksela zachowuje współrzędne na ekranie i wagę która przydaje się w przypadku półprzezroczystości. Dodatkowo po etapie rysowania można przeprowadzić raytracing dla połyskliwych fragmentów (w przypadku gdy zajmują nieznaczną część ekranu), dodając uzyskane składniki do bufora liniowego. Potem całość można oświetlić etc. Dzięki mocnemu wsparciu dla półprzezroczystości prostsze staje się osiągniecie np. efektu prawdziwego DoF.

Offline Krzysiek K.

  • Moderator
    • DevKK.net

# Sierpień 02, 2011, 19:29:44
Można, ale nie widzę większego sensu w tych buforach liniowych.