Warsztat » Forum

[Programowanie grafiki] Jaka metoda generowania dynamicznych cieni ?

Jul 25, 2006 | skalniak |
17 wypowiedzi na 2 stronach:
1 2
skalniak
Jul 25, 2006

Jaka metoda generowania dynamicznych cieni ?

czesc, jest kilka metod generowania cieni dynamicznych ktora polecacie ? (glownym kryterium jest oczywiscie predkosc ale nie tylko (trudnosc w implementacji tez odgrywa duza role:)  )

Pozdr. skalniak
CzerwonyKapturek
Jul 27, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Są dwa podstawowe algorytmy generowania dynamicznych cieni: mapy cieni i tzw shadow volumes (stencil shadows). Żaden z nich nie jest prostszy w implementacji. Powiedziałbym że oba są średnio trudne, a jak będziesz chciał napisać je naprawdę dobrze (wraz z wieloma modyfikacjami i bajerami które wymyślono) to zajmie ci to jeszcze więcej czasu.

Shadow volumes:
(+) automatycznie rzucaja cień na wszystko w scenie
(-) tylko ostre (twarde) cienie
(-) część tego algorytmu musi zostać wykonana na CPU - ogranicza to mozliwość optymalizacji (w tym sensie że nie zrobi za nas tego karta)
(-) wymagają dodatkowych danych (o krawędziach trójkatów albo o sąsiadach trójkatów) - trzeba je wygenerawać

Shawow maps:
(+) łatwiej o miękkie cienie
(+) właściwie cały algorytm działa na GPU (100% sprzętowej akceleracji)
(+) nie wymaga dodatkowych danych
(-) wymagają dodatkowej tekstury (zajmują dodatkową jednostkę teksturującą)
(-) nie jest tak automatyczny jak shadow volumes - wymaga odpowiedniej kolejności renderowania i dobrego zaplanowania całej funkcji renderujacej

odmiany:
-zwykłe mapy cieni - poprostu renderujesz obiekt który ma rzucać cień na czarno do jakiejś tekstury i to jest mapa cienia
-depth maps - standardowa odmiana (nie będę sie rozpisywał bo to temat na sporu artykuł)
-priority maps (priority buffer, mapy priorytetowe, bufory priorytetowe) - znowu temat rzeka (jest opisane w perełkach programowania gier)
-smoothies - miękkie cienie
-penumbra maps - miękkie cienie

Osobiście wolę shadow maps - są szybsze, a jeżeli nie są to w przyszłości będą (bo są w 100% wykonywane przez kartę - są nawet do tego specjalne rozszerzenie w OpenGL). Pozatym większość algorytmów renderowania miękkich cieni opiera się właśnie na mapach cienia. Kiedyś wolałem shadow volumes - wydawały mi się prostsze, pozatym automatycznie rzucały cień na wszystko i wogóle to dość fajny algorytm. Pozatym nie potrzebują dodatkowej jednostki teksturującej (a gdy miałem GF4MX z 2 jednostkami to był to naprawdę mocny argument - dziś na moim GF5 z 8 juz nie :D) Wydaje mi się że shadow volumes poprostu się zestarzały i w naturalny sposób odchodzą w przeszłość. Ale to tylko moje subiektywne zdanie. Zresztą na shadow volumes opiera się też wiele innych algorytmów (np light volumes - renderowanie snopów światła, albo renderowanie obrysu obiektu itp)
SirMike
Jul 27, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Shadow volumes:
...
(-) wymagają dodatkowych danych (o krawędziach trójkatów albo o sąsiadach trójkatów) - trzeba je wygenerawać


Mozesz je wczytac bezposrednio z pliku a wygenerowac je podczas eksportu z edytora 3D, w ktorym robisz modele.

Cytat:

Wydaje mi się że shadow volumes poprostu się zestarzały i w naturalny sposób odchodzą w przeszłość. Ale to tylko moje subiektywne zdanie. Zresztą na shadow volumes opiera się też wiele innych algorytmów (np light volumes - renderowanie snopów światła, albo renderowanie obrysu obiektu itp)


Swego czasu to chyba jedynie Carmack ich uzywal i zachwalal ;)
Wydaje mi sie jednak, ze nie odchodza do lamusa, po prostu malo ludzi tego uzywa - ale to tylko moja opinia.
Krzysiek K.
Jul 26, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:
Shadow volumes:
(+) automatycznie rzucaja cień na wszystko w scenie
(-) tylko ostre (twarde) cienie
(-) część tego algorytmu musi zostać wykonana na CPU - ogranicza to mozliwość optymalizacji (w tym sensie że nie zrobi za nas tego karta)
(-) wymagają dodatkowych danych (o krawędziach trójkatów albo o sąsiadach trójkatów) - trzeba je wygenerawać

Shawow maps:
(+) łatwiej o miękkie cienie
(+) właściwie cały algorytm działa na GPU (100% sprzętowej akceleracji)
(+) nie wymaga dodatkowych danych
(-) wymagają dodatkowej tekstury (zajmują dodatkową jednostkę teksturującą)
(-) nie jest tak automatyczny jak shadow volumes - wymaga odpowiedniej kolejności renderowania i dobrego zaplanowania całej funkcji renderujacej

Parę komentarzy:
- ostre cienie nie muszą być minusem, wszystko zależy od tego, jaki klimat ma mieć renderer
- shadow volume _nie musi_ wogóle być wykonywany na CPU, przy użyciu odpowiedniego vertex shadera można całą obsługę geometrii przeprowadzić na GPU
- shadow maps nie tylko zajmują dodatkową jednostkę teksturującą, ale też wymagają nietypowych operacji na teksturze (porównanie głębokości)
- nie wspomniałeś o znaczącej wadzie shadow map - bardzo lubią się aliasować na skutek niewystarczającej rozdzielczości tekstury i/lub niewystarczającej precyzji zapisanej odległości

Cytat:
Osobiście wolę shadow maps - są szybsze, a jeżeli nie są to w przyszłości będą (bo są w 100% wykonywane przez kartę - są nawet do tego specjalne rozszerzenie w OpenGL).

Jak już powiedziałem, shadow volume też można w całości wykonywać na GPU. :)


Z mojego punktu widzenia wygląda to tak: Jak chcesz kombinować z miękkimi cieniami, to shadow mapy, a jeżeli wystarczą Ci twarde, to shadow volume'y. Shadow mapy dobrze współpracują z shaderami, które mogą je zmiękczać, albo można użyć innych technik je zmiękczających (np. penumbra maps), ale obawiam się, że bez zmiękczania przy sensownych rozmiarach tekstury mogą mieć za małą jakość. Shadow volume, chociaż jest przeznaczony głównie do twardych cieni, jest prosty w implementacji (zwłaszcza w OpenGL, bo nie trzeba bawić się w renderowanie do cubemapy), jedyne ograniczenie to takie, że trzeba nieco uważać na fillrate i stosować pewne taktyki ograniczające to, gdzie rysujemy shadow volume. :)
CzerwonyKapturek
Jul 28, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Cytat:

Shadow volumes:
...
(-) wymagają dodatkowych danych (o krawędziach trójkatów albo o sąsiadach trójkatów) - trzeba je wygenerawać

Mozesz je wczytac bezposrednio z pliku a wygenerowac je podczas eksportu z edytora 3D, w ktorym robisz modele.

No tak, ale trzeba to zrobić samemu (generowanie, zapis) - wymaga to trochę roboty i byc może zmianę/modyfikację niektórych formatów plików (nie wiem czy któryś z popularnych foramtów 3d przechowywuje informację o krawędziach, albo sąsiednich trójkątach - ja w każdym razie stosowałem swój własny format pliku). Tak czy inaczej to są dodatkowe dane która zajmują troche pamięci

Cytat:

Cytat:

Wydaje mi się że shadow volumes poprostu się zestarzały i w naturalny sposób odchodzą w przeszłość. Ale to tylko moje subiektywne zdanie. Zresztą na shadow volumes opiera się też wiele innych algorytmów (np light volumes - renderowanie snopów światła, albo renderowanie obrysu obiektu itp)

Swego czasu to chyba jedynie Carmack ich uzywal i zachwalal ;)
Wydaje mi sie jednak, ze nie odchodza do lamusa, po prostu malo ludzi tego uzywa - ale to tylko moja opinia.

Mało ludzi ich używa bo dzisiaj GPU rozwijają się szybciej niż CPU i dlatego algorytmy oparte w 100% na GPU (shadow maps) będą szybsze i bardziej przyszłościowe od tych opartych tylko na CPU i mieszanych (shadow volumes). Pozatym przyszłością są miękkie cienie, które wkrótce pewnie będą standardem w grach (tak jak dzisiaj np bumpmapping), a robienie miękkich cieni w oparciu o stencil shadows to koszmar.

Cytat:

- shadow volume _nie musi_ wogóle być wykonywany na CPU, przy użyciu odpowiedniego vertex shadera można całą obsługę geometrii przeprowadzić na GPU

Hmm. No ale jak na GPU wykryć które krawędzi mają rzucać cień? Vertex shader operuje przecież na wierzchołkach, a nie na trójkatach lub krawędziach.

Cytat:

- shadow maps nie tylko zajmują dodatkową jednostkę teksturującą, ale też wymagają nietypowych operacji na teksturze (porównanie głębokości)

Są od tego specjalne rozszerzenia w OpenGL (albo fp na którym juz wogóle można wszystko ;D)

Cytat:

- nie wspomniałeś o znaczącej wadzie shadow map - bardzo lubią się aliasować na skutek niewystarczającej rozdzielczości tekstury i/lub niewystarczającej precyzji zapisanej odległości

Słusznie to jest problem - i po to właśnie stosuje się wspomniane mapy priorytetowe. Inna sprawa że ja np zapisuje sobie w moim enginie mapy cienia o precyzji 24bity (czyli takiej jak mój bufor głębi) i z aliasowaniem nie mam problemu (no ale wymaga to fp)

Aha i jeszcze jedno Krzysiek zwrócił uwagę na ważna rzecz:
Shadow volumes:
(+) znacznie lepsze do twardych cieni niż shadow maps

No i jeszcze mi się przypomniało
Shadow maps:
(-) przy pewnych ustawieniach kamera/światło będzie widoczny aliasing niezależnie od rozdzielczości shadow mapy! (np wtedy gdy świato świeci [i rzuca cień] prosto w kierunku kamery - światło jest [prawie] za obiektem)
Krzysiek K.
Jul 27, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:
Hmm. No ale jak na GPU wykryć które krawędzi mają rzucać cień? Vertex shader operuje przecież na wierzchołkach, a nie na trójkatach lub krawędziach.

Dodaje się dodatkowe wierzchołki tak, żeby każdy trójkąt miał własny zestaw 3 wierzchołków, których normalna jest równa normalnej trójkąta. Następnie dodaje się zdegenerowane czworokąty na wszystkich krawędziach (czworokąt = 2 trójkąty). Podczas renderowania vertex shader decyduje, czy dana kopia wierzchołka ma zostać w miejscu, czy ma być extrude'owana. Jeżeli jeden trójkąt jest oświetlony, a jego sąsiad jest tyłem do światła, to trójkąt oświatlony zostanie w miejscu, a trójkąt zwrócony tyłem zostanie extrude'owany, co spowoduje rozciągnięcie się czworokątu na krawędzi pomiędzy nimi, który stanie się scianą shadow volume. :)

Cytat:
Są od tego specjalne rozszerzenia w OpenGL

Ale nie każda karta je obsługuje. :)

Cytat:
Inna sprawa że ja np zapisuje sobie w moim enginie mapy cienia o precyzji 24bity (czyli takiej jak mój bufor głębi) i z aliasowaniem nie mam problemu (no ale wymaga to fp)

Jakiej rozdzielczości cubemapy używasz? :)
CzerwonyKapturek
Jul 29, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Cytat:
Hmm. No ale jak na GPU wykryć które krawędzi mają rzucać cień? Vertex shader operuje przecież na wierzchołkach, a nie na trójkatach lub krawędziach.

Dodaje się dodatkowe wierzchołki tak, żeby każdy trójkąt miał własny zestaw 3 wierzchołków, których normalna jest równa normalnej trójkąta. Następnie dodaje się zdegenerowane czworokąty na wszystkich krawędziach (czworokąt = 2 trójkąty). Podczas renderowania vertex shader decyduje, czy dana kopia wierzchołka ma zostać w miejscu, czy ma być extrude'owana. Jeżeli jeden trójkąt jest oświetlony, a jego sąsiad jest tyłem do światła, to trójkąt oświatlony zostanie w miejscu, a trójkąt zwrócony tyłem zostanie extrude'owany, co spowoduje rozciągnięcie się czworokątu na krawędzi pomiędzy nimi, który stanie się scianą shadow volume. :)

Hmm, brzmi skomplikowanie, ale jednak jest możliwe :)

Cytat:

Cytat:
Inna sprawa że ja np zapisuje sobie w moim enginie mapy cienia o precyzji 24bity (czyli takiej jak mój bufor głębi) i z aliasowaniem nie mam problemu (no ale wymaga to fp)

Jakiej rozdzielczości cubemapy używasz? :)

Zmiennej rozdzielczości :D
(domyślnie chyba 256*256*6 RGB)
skalniak
Aug 1, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

dzieki za zarys wad i zalet jednej i drugiej metody :) :) mam jeszcze pytenie takie czy shadow map'ami uzyska sie rzucanie cieni obiektu na samego siebie ?
wyszo
Jul 31, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

@ Skalniak: Oczywiście że tak! Był i nawet chyba jest o tym art na warsztacie  :D
skalniak
Jul 31, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

@ Skalniak: Oczywiście że tak! Był i nawet chyba jest o tym art na warsztacie  :D

jesli chodzi Ci o art o shadow mapach na gf3 i gf4 to autor tam wypowiada sie nie najlepiej o tej metodzie do swiatel punktowych co sie chyba nie pokrywa z ww opiniami. Ten art miales na mysli  ?
SauRooN
Aug 2, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Cytat:

@ Skalniak: Oczywiście że tak! Był i nawet chyba jest o tym art na warsztacie  :D

jesli chodzi Ci o art o shadow mapach na gf3 i gf4 to autor tam wypowiada sie nie najlepiej o tej metodzie do swiatel punktowych co sie chyba nie pokrywa z ww opiniami. Ten art miales na mysli  ?

Ze światłami punktowymi jest większy problem dlatego, że trzeba z takiego światła wykonać 6 "zdjęć" (wyrenderowań głębi do tekstury) we wszystkich kierunkach (w przypadków spot'ów w większości przypadków 1 zdjęcie) i zrobić z nich cubemapę. Później różnice są tylko w mapowaniu z tej cubemap'y. Ta technika jest wykorzystywana w Unreal 3 Engine.
SirMike
Aug 1, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Hmm, brzmi skomplikowanie, ale jednak jest możliwe :)


Tylko brzmi - w rzeczywistosci jest banalne tym bardziej jak zaprzegniemy do tego Vertex Shader.
Wszystko masz dokladnie opisane np. w SDK od DirectX'a
Krzysiek K.
Aug 4, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:
Ze światłami punktowymi jest większy problem

Powiedziałbym, że to ze spotlightem jest mniejszy problem. Wydaje mi się, że światła punktowe są dużo bardziej popularne. :)
SauRooN
Aug 6, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Cytat:

Powiedziałbym, że to ze spotlightem jest mniejszy problem. Wydaje mi się, że światła punktowe są dużo bardziej popularne. :)

No ja bym powiedział, że spot'y są bardziej popularne :) Ale to już byłaby niekonstruktywna dyskusja, więc dajmy spokój z offtop'em ;)
Merlith
Aug 7, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

Nie wiem, czy była juz mowa o perspective shadow maps:

http://www-sop.inria.fr/reves/Marc.Stamminger/psm/

tommyz
Aug 20, 2006

Odp: Jaka metoda generowania dynamicznych cieni ?

PSM bym niepolecał. Zamiast tego duzo lepiej uzyć Trapezoidal Shadow Maps(mówie to z własnych doświadczeń).
Trzeba posiedziec ze dwa dni nad pdfem i kodem ale efekty sa bardzo dobre.
Strony:
1 2