woensdag 25 februari 2009

VIC cluster

Omdat het renderen van afbeeldingen tot convergentie zelfs in heel eenvoudige gevallen veel tijd (dagen) vergt, hebben we besloten om ook te renderen op de VIC rekencluster van de kuleuven. Hiervoor was echter een port naar linux nodig. Hier zijn we de een groot deel van de week aan bezig geweest.

Een extra probleem was dat we al onze afbeeldingen niet in een HDR formaat hebben bijgehouden. We hebben de rgb waarden gewoon geclampt tussen [0, 1], en het resultaat naar png files weggeschreven. Hierdoor gaat er echter heel wat informatie verloren. Dus was het nodig om alles te herrenderen en op te slaan in een HDR formaat.

Hiervoor hebben we een eigen (eenvoudig) formaat aangemaakt (omdat EXR zowel op windows als op de rekencluster (linux) te compileren te tijdrovend was). Ons eigen formaat kan later echter eventueel worden omgezet naar het EXR formaat.

Verder was het ook nodig om een tonemapper te implementeren, in plaats van te clampen tussen [0, 1]. We hebben daarvoor de methode van Reinhard geïmplementeerd. De code werkt nog niet 100%, maar dit is in dit stadium nog niet belangrijk.

Op deze moment zijn we bezig om op de cluster alles te herrenderen.

Nieuwe scenes

Om de juistheid van ons algoritme te testen, hebben we een aantal eenvoudige testscenes gemaakt. Op die manier zal het eenvoudiger zijn om eventuele fouten te zien. Dit zijn de scenes :


In deze scene is slechts weinig indirecte belichting (de lichtbron fungeert wel ook als diffuus oppervlak). Hier kunnen we dus zien of direct licht goed werkt.

In deze scene kunnen we testen of oppervlakken gezien door een reflecterend object juist worden gerenderd. Deze scene bevat ook caustics, maar deze zijn niet zo prominent.

In deze scene kan worden getest of schaduw goed wordt weergegeven.

In deze scene kan diffuse interreflectie (en dus ook color bleeding) worden getest.

Deze scene kan worden gebruikt om caustics (en gereflecteerde caustics) te testen.

We gaan waarschijnlijk nog een aantal andere eenvoudige scenes maken die bepaalde situaties testen, maar eerst gaan we zien of deze gevallen al correct zijn.

woensdag 18 februari 2009

Bondige Samenvatting

We zijn gedurende de afgelopen twee weken ook bezig geweest met het maken van een bondige samenvatting van hoe ons algoritme nu eigenlijk werkt. We beschrijven de werking van ERPT en de meeste mutaties die we gebruiken (buiten de nieuwste toevoegingen). Verder staan er ook nog een aantal punten in waar we nog niet helemaal uit over zijn. De meeste daarvan houden verband met het berekenen van de Acceptance probabilities.

We geven een link waarop deze file terug te vinden is.

Samenvatting

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.

maandag 9 februari 2009

Multi-chain Perturbation

In deze paper hebben we het idee voor de multi-chain perturbation gevonden. Deze mutatie is een variatie op lens perturbations, maar is in staat om zowel caustics als reflectie paden te muteren. Bovendien is het ook mogelijk om paden, die voorheen niet met lens of caustic perturbations gemuteerd konden worden, te muteren. Met andere woorden : deze mutatie is compleet in de zin dat ze de enige nodige mutatie is om het beeld met ERPT te renderen.

Afbeelding gerenderd met ERPT, en enkel multi-chain perturbations

Er zijn echter wel enkele nadelen aan deze mutatie. Een probleem is dat de caustics niet optimaal verspreid kunnen worden. Dit komt omdat er nog altijd vanuit het oog wordt 'getraced'. Hierdoor kan de mutatie nog altijd relatief gemakkelijk de lichtbron missen. Dit zorgt in bepaalde gevallen voor een blokkerig effect (voor vierkante lichtbronnen). Verder vergen ze iets meer rekentijd dan lens en caustic perturbations. Toch zijn ze veel efficienter dan random number mutations.

Reflectie caustics bij multi-chain perturbations. Klein aantal initiele samples.

Reflectie caustics bij multi-chain perturbations. Meer initiele samples. Het blocking effect vervaagt naar mate er meer initiele samples worden genomen.

Reflectie caustics gerenderd door een path tracer (referentie)

De beste strategie lijkt ons om een mengeling van lens, caustics en multichain perturbations te gebruiken. Elk van deze verschillende mutaties heeft bepaalde voordelen, en door deze te combineren krijgen we het meest efficiente en robuuste algoritme.

Comeback Blogpost

Tijdens de blok en de examens hebben we ons vooral bezig gehouden met de examens zelf, en hebben we dus niet verder gewerkt aan de thesis. toch zijn er een aantal interessante aanpassingen gedaan.

Het belangrijkste is dat we hebben gevonden wat er fout was aan het berekenen van de acceptance probability van de caustic perturbation. Het probleem was dat de hoek waarmee geperturbeerd werd, bepaald was adhv het pad zelf. Hierdoor varieert deze hoek bij verschillende paden, en was deze hoek ook verschillend tussen het originele en gemuteerde pad. Hiermee werd geen rekening gehouden bij het berekenen van de acceptance probability, waardoor er fouten ontstonden. Onze voorlopige oplossing is om de perturbatie hoek constant te nemen voor alle paden. Dit bleek een juiste oplossing te zijn. Een andere mogelijkheid is om de variabele hoeken in rekening te brengen bij het berekenen van de acceptance probability, maar dat is waarschijnlijk niet nodig.

Een groot voordeel van het vinden van deze fout is om te beginnen dat deze mutatie nu juist geïmplementeerd is, maar vooral dat we nu ook beter begrijpen hoe deze acceptance probabilities in het algemeen kunnen berekend worden. Daarom hebben we een nieuwe mutatie geïmplementeerd : de multi-chain perturbation (zie volgende blogpost). Ook zijn we nu van plan om een nieuwe mutatie te ontwerpen die specifiek het probleem van de ruis in de hoekjes zou moeten oplossen. Daarover meer later.