donderdag 11 december 2008

Samenvatting werking ERPT

Als voorbereiding voor de presentatie van volgende week, leggen we de werking van ERPT nog eens bondig uit. ERPT staat voor Energy Redistribution Path Tracing. Energy Redistribution is een techniek om gecorelleerde integralen op te lossen. Omdat de waarden in verschillende pixels in een afbeelding het resultaat zijn van gecorelleerde integralen, kunnen we deze techniek gemakkelijk toepassen.

Het algoritme begint met het aanmaken van een pad. Elk pad heeft een bepaalde hoeveelheid energie die overeenkomt met het licht dat door het pad naar de camera vloeit. Door middel van mutaties gaat deze energie worden verdeeld over verschillende pixels. Een pad met hoge energie zal vaker gemuteerd worden, en zal dus meer energie afzetten op het image plane.

Energie verspreid over meerdere pixels

De kost van het vinden van goede paden wordt op deze manier verspreid over meerdere pixels. Globaal gezien gaat er dus minder moeite moeten worden gedaan om goede paden te gebruiken. ERPT steunt dus op het zelfde idee als MLT, waar belangrijke paden beter worden onderzocht.

Als we op deze manier het algoritme uitvoeren krijgen we echter geen correct resultaat. De verkregen afbeelding zal te veel energie krijgen op plaatsen en te weinig op andere, zoals hieronder gedemonstreerd :

Foute verspreiding van energie (links), referentie (rechts)

Het probleem is dat wanneer energie uit een bepaalde pixel gaat afgezet worden in andere pixels, er geen garantie is dat hij ook genoeg energie terugkrijgt van de andere pixels. Om het algoritme correct te houden moet de pixel evenveel energie terugkrijgen als dat hij weggeeft. Dit heet general balance. Een strengere voorwaarde is detailed balance. Hierbij moet de energie die van pixel x naar naar pixel y vloeit gelijk zijn aan de energie die van pixel y naar pixel x vloeit. Detailed balance garandeert general balance en is gemakkelijker af te dwingen.

Afbeelding uit : [CTE 05]

Concreet kan men detailed balance afdwingen door niet alle mutaties te aanvaarden, maar sommige nieuwe paden te verwerpen. Dit gebeurt aan de hand van de 'acceptance probability'. Deze waarde houdt rekening met de kans dat het gemuteerd pad terug gaat bijdragen tot het oorspronkelijk pixel, en steunt dus op detailed balance. Wanneer men deze acceptance probability correct toepast krijgt men betere resultaten :

Juiste verdeling van de energie (links) + referentie (rechts)

In tegenstelling tot MLT is dit algoritme wel goed te stratificeren, doordat de initiele paden op een gestratificeerde manier op het image plane worden gegenereerd. Omdat we veel initiele paden nemen, vermijden we de startup bias van MLT, en bovendien is het niet nodig om een volledige set mutaties te nemen. Dit maakt het algoritme een stuk eenvoudiger dan MLT.

woensdag 10 december 2008

Verslag deze week

Deze week hebben we ons vooral beziggehouden met het maken van onze volgende presentatie. Wegens het drastisch wijzigen van de presentatievorm hebben we er langer aan gewerkt dan voorzien. Ook veel tijd is gestoken in het renderen van prentjes die gebruikt moeten worden in de presentatie :

- Een zelfde scene, maar met verschillende parameters (om de invloed van parameters te bestuderen)
- Een paar goede referenties van onze scenes

Een paar prentjes die we niet willen achterhouden (bedoeld als referenties) :

Rendertijd : ongeveer 66h met een path tracer (512 x 512 samples per pixel)

Rendertijd : ongeveer 16h met een path tracer (256 x 256 samples per pixel)

woensdag 3 december 2008

Nieuwe mutaties vs. Path tracer


Scene gerender met een path tracer
Rendertijd : ongeveer 8min 30s


Scene gerenderd met ERPT (nieuwe mutaties)
Rendertijd : ongeveer 10 min

Bij de gewonde path tracer zien we vooral gelijkmatig verspreidde ruis. Bij de ERPT render is er minder ruis, maar is de belichting meer geclusteerd. Voor de rest is het verschil in kwaliteit vrij klein.

Andere kleine nieuwigheden

Nu we scenes zoals de bunny scene gebruiken om te testen, hadden we nood aan een betere versnellingsstructuur. We hebben de grid accelerator vervangen door een kd-tree (implementatie overgenomen van luxrender en aangepast aan onze raytracer). De bunny scene rendert nu ongeveer een factor 3 sneller.

Een tweede aanpassing is het aanpassen van de BSDF sampling. Een BSDF bestaat uit een lijst van verschillende componenten (BRDF's en BTDF's). Bij het samplen van een BSDF werd vroeger uniform één van de componenten gekozen. Dit is suboptimaal. Het is beter om ook hier importance sampling op toe te passen. Nu krijgt elke component van de BSDF een gewicht mee, afhankelijk van de hoeveelheid licht dat wordt gereflecteerd door de component en de vector waarlangs het licht invalt. Aan de hand van deze gewichten kan een pdf worden geconstrueerd, en gebruik makende van deze pdf wordt een component geselecteerd.

Dit levert vooral voordelen op bij bijvoorbeeld een glazen bol, waar de verhouding tussen de reflectie en de transmissie sterk varieert over het oppervlak (afhankelijk van de fresnel distributie). Het effect is wel moeilijker te illustreren om dat de verschillen redelijk klein zijn in de meeste gevallen, en een geoefend oog nodig hebben om herkend te worden.

Nieuwe mutaties

Omdat we caustic perturbations niet juist hebben gekregen, hebben we besloten om een ander type mutaties te gebruiken in ons algoritme. Deze mutaties staan beschreven in de volgende paper : A Simple and Robust Mutation Strategy for the Metropolis Light Transport Algorithm. Deze mutaties worden niet gedaan in de ruimte van paden, maar in de ruimte van random getallen.

Om dit te kunnen doen wordt een path eerst getransformeerd naar de ruimte van random getallen. Daarna worden de verkregen random getallen gemuteerd. Op het einde wordt de nieuwe reeks random getallen weer getransformeerd naar een path.

Het voordeel van deze nieuwe methode is dat ze zeer robuust en eenvoudig te implementeren is. Een groot bijkomend voordeel is dat de acceptance probability zeer gemakkelijk te bepalen is, wat bij caustic perturbations voor ons zeer moeilijk bleek te zijn. Het nadeel is dat elke mutatie opnieuw een geheel path moet construeren. Er is dus geen sprake van hergebruik van vorige paden, wat wel het geval was bij lens en caustic perturbations. Dit maakt deze methode inherent trager.

We hebben onze ERPT implementatie aangepast om ook dit nieuw type mutatie te gebruiken. Hieronder volgen een aantal resultaten :


Scene op (relatief) lage kwaliteit

De zelfde scene op hogere kwaliteit

De bunny scene met dit keer juiste caustics

Op deze afbeeldingen is ook te zien dat bepaalde nadelen, (zoals de vlekken in de hoeken van de box) grotendeels verdwenen zijn. Dit is te danken aan het feit dat nu de mutaties van dit soort paden ook een hoge acceptance probability krijgen. De paar vlekken die nog te zien zijn, zijn te wijten aan caustics.