| Description | Hierarchy | Fields | Methods | Properties |
type TPathTracer = class(TRayTracer)
Path tracer. See [http://vrmlengine.sourceforge.net/vrml_engine_doc/output/xsl/html/ch04s03.html] for documentation.
![]() |
MinDepth: Integer; |
![]() |
RRoulContinue: Single; |
![]() |
PrimarySamplesCount: Cardinal; |
![]() |
NonPrimarySamplesCount: Cardinal; |
![]() |
DirectIllumSamplesCount: Cardinal; |
![]() |
SFCurveClass: TSpaceFillingCurveClass; |
![]() |
constructor Create; |
![]() |
procedure Execute; override; |
![]() |
MinDepth: Integer; |
|
Jezeli nie chcesz uzywac w ogole rosyjskiej ruletki to daj RRoulContinue = 0.0 (tak, porownywanie Random < RRoulContinue jak zwykle uzywa _ostrej_ nierownosci, co jest konsekwente bo Random zwraca wyniki z przedzialu [0;1) ). Przestrzegam jednak przed rezygnowaniem z rosyjskiej ruletki - rezygnacja ta powoduje bias na obrazku; obrazek wynikowy jest ciemniejszy niż powinien być. Przestrzegam też przed dawaniem _bardzo_ malych wartosci dla RRoulContinue - w wyniku tego bedziemy niekiedy skalowali wynik przez 1/RRoulContinue (= bardzo duzo jezeli RRoulContinue = bardzo malo) a niekiedy wynik bedzie = 0, wiec rosyjska ruletka spowoduje tu olbrzymia wariancje (a wiec noise). RRoulContinue powinno byc w zakresie 0..1, jesli nie jest - bedzie clamped. Jezeli nie chcesz uzywac Uzywanie rosyjskiej ruletki gwarantuje nam ze nie mamy biasu (bez wzgledu na | |
![]() |
RRoulContinue: Single; |
![]() |
PrimarySamplesCount: Cardinal; |
|
Primary- i NonPrimary- SamplesCount okreslaja ile sciezek wygenerowac dla kazdego pixela (obie musza byc >0, co jest sprawdzane uzywajac Check(), nawet w wersji RELEASE). Primary mowi ile promieni pierwotnych jest puszczanych dla kazdego pixela obrazka; dla kazdego promienia pierwotnego ktory trafi w scene generowanych jest nastepnie NonPrimary sciezek (tzn. teraz juz prawdziwych sciezek, ktore nie rozgaleziaja sie dalej). Razem mamy wiec Primary*NonPrimary sciezek dla kazdego pixla. Jezeli dasz NonPrimary = 1 i bedziesz operowal tylko Primary to w rezultacie otrzymasz naiwna wersje path tracera, ktora np. dla 1000 sciezek bedzie musiala przesledzic 1000 (tyle samo) promieni. O ile wziecie 1000 sciezek ma sens jesli chcesz miec ladny obrazek z path tracera o tyle liczenie az 1000 promieni pierwotnych ma tutaj male zastosowanie. Wiekszosc z tych promieni pierwotnych bedzie trafiala w jeden i ten sam punkt sceny i dopiero dalsze kroki sciezki beda determinowaly faktyczne roznice w kolorach przynoszonych przez konkretne sciezki. Innymi slowy, promienie pierwotne tworza scisla wiazke i chcemy to wykorzystac. W powyzszym przykladzie zmiana na Primary = 1 i NonPrimary = 1000 da ciagle 1000 sciezek na scene (i rendering rzeczywiscie bedzie mial taka sama jakosc, taki sam poziom szumu) a czas renderowania bedzie mniejszy (o ile dokladnie bedzie krotszy - to zalezy od dlugosci sredniej sciezki, jesli sciezki sa b. dlugie to niewiele tutaj pomozemy bo w koncu optymalizujemy tylko 1 krok kazdej sciezki; ale zazwyczaj sciezki nie sa zbyt dlugie). Jedyna wada to ze zmniejszenie Primary do 1 spowodowalo aliasing. Mozna temu zaradzic zwiekszajac (ale tylko nieznacznie !) Primary, np. Primary = 10 i NonPrimary = 100 powinno dac nam dobry antialiasing, zachowujac 1000 sciezek dla pixela i jednoczesnie lepszy czas renderowania. Faktem ktory ratuje nam tutaj tylek jest to ze dla antialiasingu nie potrzebujemy az tak wielu probek na pixel. | |
![]() |
NonPrimarySamplesCount: Cardinal; |
|
Primary- i NonPrimary- SamplesCount okreslaja ile sciezek wygenerowac dla kazdego pixela (obie musza byc >0, co jest sprawdzane uzywajac Check(), nawet w wersji RELEASE). Primary mowi ile promieni pierwotnych jest puszczanych dla kazdego pixela obrazka; dla kazdego promienia pierwotnego ktory trafi w scene generowanych jest nastepnie NonPrimary sciezek (tzn. teraz juz prawdziwych sciezek, ktore nie rozgaleziaja sie dalej). Razem mamy wiec Primary*NonPrimary sciezek dla kazdego pixla. Jezeli dasz NonPrimary = 1 i bedziesz operowal tylko Primary to w rezultacie otrzymasz naiwna wersje path tracera, ktora np. dla 1000 sciezek bedzie musiala przesledzic 1000 (tyle samo) promieni. O ile wziecie 1000 sciezek ma sens jesli chcesz miec ladny obrazek z path tracera o tyle liczenie az 1000 promieni pierwotnych ma tutaj male zastosowanie. Wiekszosc z tych promieni pierwotnych bedzie trafiala w jeden i ten sam punkt sceny i dopiero dalsze kroki sciezki beda determinowaly faktyczne roznice w kolorach przynoszonych przez konkretne sciezki. Innymi slowy, promienie pierwotne tworza scisla wiazke i chcemy to wykorzystac. W powyzszym przykladzie zmiana na Primary = 1 i NonPrimary = 1000 da ciagle 1000 sciezek na scene (i rendering rzeczywiscie bedzie mial taka sama jakosc, taki sam poziom szumu) a czas renderowania bedzie mniejszy (o ile dokladnie bedzie krotszy - to zalezy od dlugosci sredniej sciezki, jesli sciezki sa b. dlugie to niewiele tutaj pomozemy bo w koncu optymalizujemy tylko 1 krok kazdej sciezki; ale zazwyczaj sciezki nie sa zbyt dlugie). Jedyna wada to ze zmniejszenie Primary do 1 spowodowalo aliasing. Mozna temu zaradzic zwiekszajac (ale tylko nieznacznie !) Primary, np. Primary = 10 i NonPrimary = 100 powinno dac nam dobry antialiasing, zachowujac 1000 sciezek dla pixela i jednoczesnie lepszy czas renderowania. Faktem ktory ratuje nam tutaj tylek jest to ze dla antialiasingu nie potrzebujemy az tak wielu probek na pixel. | |
![]() |
DirectIllumSamplesCount: Cardinal; |
|
| |
![]() |
SFCurveClass: TSpaceFillingCurveClass; |
|
For now it's not useful to change the value of this field. Using any other than default (TSwapScanCurve) curves doesn't give any speed benefit. TSwapScanCurve przynajmniej pozwala latwo oddzielic na obrazku czesc zrobiona i niezrobiona (i dzieki temu np. view3dscene moze szybciej rysowac obrazek w miare generowania). | |
![]() |
constructor Create; |
![]() |
procedure Execute; override; |