woensdag 18 februari 2009

Nieuwe mutatie

Tijdens het testen van onze implementatie is gebleken dat hoeken tussen diffuse oppervlakken vaak veel ruis vertoonden in vergelijking met de rest van de oppervlakken. Een voorbeeld hiervan is te zien in figuur 1.

figuur 1

Daarom hebben we getest waarom dit zo is. Het probleem is dat de acceptance probabilty zeer laag is omwille van twee zaken :
  • de verhouding van 2 afstand-kwadraat termen, die zeer laag is, omdat 1 van de afstanden zeer klein is, en de andere afstand in verhouding zeer groot wordt wanneer een kleine wijziging aan het pad wordt toegevoegd.
  • de verhouding van 2 cosinussen die zeer laag is, omdat 1 van de cosinussen zeer snel naar 0 gaat wanneer een kleine wijziging aan het pad wordt toegevoegd.
Doordat de acceptance probability zo laag is worden de paden amper gemuteerd, en dus gaat er ruis verschijnen op die plaatsen.

Een mogelijke oplossing voor dit probleem zou zijn om regelmatig gewoon een nieuw pad aan te maken in plaats van het te perturbaren. Dit is echter geen ideale oplossing omdat zo een groot deel van de stratificatie op het beeldoppervlak wordt verloren (en daar blinkt ERPT juist in uit tov MLT), maar ook omdat dit niet heel efficient is. Wanneer te vaak nieuwe paden worden gesampled in plaats van gemuteerd, gaat het algoritme ook steeds meer op een gewone path tracer lijken.

Een ander probleem in ERPT is dat een afbeelding met weinig oorspronkelijke samples per pixel nooit een complete belichting kan verkrijgen (zie figuur 2). Dit komt doordat de weinige initiële paden de path space niet voldoende samplen. De mutaties die daarna op de initiele paden worden toegepast veranderen daar niet veel aan omdat ze zeer lokaal werken. Een mogelijkheid voor dit probleem op te lossen is weer om regelmatig een volledig nieuw pad aan te maken. Maar zoals reeds vermeld heeft deze oplossing meer nadelen dan voordelen.

figuur 2 : ERPT zonder nieuwe mutatie : 1x1 samples per pixels, 10000 mutaties per pad, rendertijd : ~18 minuten

Een betere oplossing is om een nieuwe mutatie te gebruiken die dat specifieke probleem aanpakt. Vermits we nu veel beter begrijpen hoe de acceptance probability precies werkt, is het ons gelukt om zelf een mutatie te ontwerpen die deze 2 problemen gevoelig vermindert. De mutatie werkt eerst als een lens perturbation : er wordt een nieuwe, licht gewijzigde richting gekozen op het beeldoppervlak. Dit zorgt er voor dat het algoritme mooi gestratificeerd blijft. Nadien worden er extra nodes gesampled. Het aantal extra nodes dat wordt gesampled wordt door een soort van russian roulette-achtige methode bepaald.

Doordat deze extra nodes worden gesampled wordt de problematische geometrische term weggedeeld, wat de ruis in de hoekjes sterk reduceert. Het andere voordeel van deze methode is dat de path space na de eerste bounce veel completer gesampled wordt. Hierdoor is het mogelijk geworden om met weinig initiele samples een beeld van hoogstaande kwaliteit te maken. Figuur 3 toont een afbeelding met weinig initïele samples. De verbetering ten opzichte van figuur 2 is zeer duidelijk.

figuur 3 : ERPT zonder nieuwe mutatie : 1x1 samples per pixels, 10000 mutaties per pad, rendertijd : ~20 minuten. Deze afbeelding is vergeleken met figuur 2 spectaculair beter.

Geen opmerkingen: