donderdag 7 mei 2009

Schrijf, schrijf, schrijf

Zoals de titel aangeeft houden we ons op deze moment vooral bezig met het schrijven van onze thesis. Vooral de inleidende en theoretische hoofdstukken beginnen al goed vorm te krijgen. Voor de rest zijn we nu data aan het verzamelen voor het bespreken en evalueren van het ERPT algoritme.

Beter behandelen van lichtbronnen

De hoeveelheid werk die ERPT levert is afhankelijk van de energie van een pad (bijdrage aan een pixel). Hoe hoger die energie, hoe meer het pad gemuteerd zal worden. Paden van de vorm ES*L (paden tussen de camera en de lichtbron, en paden die vanuit de camera via een aantal speculaire botsingen de lichtbron bereiken) hebben een hoge energie, maar hebben eigenlijk niet zoveel werk nodig. Een onevenredig groot deel van de rekentijd wordt dan verspild aan het muteren van deze paden. Om dit te vermijden hebben we besloten om de bijdrage van deze paden in een aparte pass van het algoritme te berekenen.

Deze pass werkt ongeveer zoals een pathtracer, met als verschil dat we zodra we een diffuus oppervlak tegenkomen we stoppen en geen bijdrage registreren, tenzij dit een lichtbron is. Wanneer we een speculair oppervlak tegenkomen, sturen we een ray in elke mogelijke reflectie of refractie richting. Alle lichtbronnen en reflecties van lichtbronnen en zo voort zijn dan bepaald. In het hoofdalgoritme worden deze paden dan gewoon genegeerd. Op deze manier berekenen we efficiënt de rechtstreekse bijdragen van de lichtbronnen zonder ruis te introduceren.

donderdag 2 april 2009

Deze week

Een eerste probleem dat we hebben opgemerkt deze week is dat onze gegenereerde statistieken er zeer slecht uit zagen. De maat voor de fout van de afbeeldingen bleek zeer traag te dalen, terwijl de visuele kwaliteit merkbaar hoger werd. Na een tijd begon de fout zelfs weer te stijgen. Dit was het gevolg van de ondersampling en zeer trage convergentie van ES*L pade (maw : rechtstreeks bekijken van de lichtbron, of het bekijken van de lichtbron via spiegels/glas, etc...). Het muteren van deze paden is bovendien zeer duur, omdat lichtbronnen meestal veel radiantie uitstralen tov de rest van de scene.

De oplossing die we voor dit probleem hebben geïmplementeerd is om een aparte 'ESL-pass' te doen. Dit houdt in dat we op een path-tracer achtige manier de rechtstreekse bijdragen van lichtbronnen berekenen. We vermijden wel alle manieren waarop ruis kan worden gegenereerd. Zo wordt geen russian roulette gebruikt, en bij bijvoorbeeld glas materialen (reflectie BRDF + transmission BTDF) wordt het pad vertakt (1 vertakking per speculaire BxDF). Op die manier kan door zeer weinig samples te nemen, een goede benadering worden gevonden.

Verder zijn we nu bezig om alle referenties te herrenderen naar hogere kwalitiet (2048x2048 : om de statistieken betrouwbaarder te maken). Nadien kunnen we beginnen met het renderen van de ERPT beelden, dit maal hopelijk wel met betere statistieken als resultaat.

vrijdag 20 maart 2009

Statistieken generen


De implementatie van ons algoritme is zo goed als afgewerkt. Nu is het natuurlijk de bedoeling om het uitgebreid te testen. Een eerste stap die ons daarbij helpt is het bekomen van de juiste informatie. Vanaf nu genereert elke run van ons algoritme een file met daarin de rendertijd, het aantal ray castings en het aantal shadow ray castings. Verder hebben we ook een aantal tools geïmplementeerd die het verschil tussen een referentie en een gerendert beeldje bepalen alsook een waarde geven voor de fout (L2 norm van het verschil). Met behulp van deze informatie kunnen we de efficiëntie van ons algoritme vergelijken met bijvoorbeeld dat van een standaard path tracer.

Om de sterke punten en/of beperkingen van ons algoritme te bepalen zijn we bezig met het aanmaken van een aantal interessantere scenes. Een eerste voorbeeld hiervan is hieronder te zien. Deze scene bevat onder meer caustics, textures, spiegelende materialen en sterke indirecte belichting. De komende dagen zullen we nog een aantal andere scenes toevoegen om zo een zo volledig mogelijk beeld van de capaciteiten van ons algoritme te krijgen.


Room scene: referentie met Path tracer

Een andere interessante scene is de deur scene van Metropolis. Deze scene toont een kamer die enkel belicht word door de kier van een openstaande deur. Wij hebben een dergelijke scene gemodeleerd. We tonen een referentie gerendert met een pathtracer.

"Deur"scene, referentie met Path tracer(1024x1024)



donderdag 12 maart 2009

Bidirectioneel paden aanmaken

Onze implementatie van ERPT gebruikt voorlopig een path tracer om de initiële paden aan te maken. Het gebruiken van een Bidirectionele path tracer (waarbij paden zowel vanuit het oog als vanuit de lichtbron aangemaakt worden) zou in bepaalde belichtingssituaties voordelen kunnen opleveren. Klassieke voorbeelden zijn onrechtstreekse belichting en caustics. Vorig semester merkten we reeds dat caustic paden minder werden gekozen. Daarom hebben we een nieuwe path sampler geïmplementeerd die op een bidirectionele manier paden zal aanmaken.

Onze nieuwe methode is gebaseerd op de Bidirectionele Path tracer van Veach (Hoofdstuk 10) waarbij paden worden gewogen met Multiple Importance sampling. In plaats van alle mogelijke bijdragen op te tellen, kiezen we er een uit, die dan als initiëel sample aan het ERPT-algoritme wordt gegeven. Deze methode moet waarschijnlijk nog wat aangepast worden en moet nog grondig worden getest. Verder moeten we nagaan of ze daadwerkelijk betere resultaten geeft.

Enkele nieuwe Materialen


Om de robuustheid van ons algoritme te testen (en om betere scenes te maken) hebben we enkele nieuwe materialen getest. Het eerste is een Plastic materiaal gebaseerd op het Blinn-brdf model. Dit materiaal is niet puur diffuus en ook niet puur speculair. Een referentie afbeelding gegenereerd met een path tracer is hieronder weergegeven.


Plastieken bol (1024 x 1024 spp)

Het tweede materiaal is half diffuus en half spiegelend. Bij elke intersectie wordt een van de twee brdf's gekozen. Een voorbeeldafbeelding is hieronder te zien.


halfspiegelende vloer (1024 x 1024 spp)

We moeten nog grondig testen of ERPT ook op de juiste manier deze materialen behandelt.

woensdag 4 maart 2009

Verslag deze week

Deze week hebben we ons vooral bezig gehouden met een aantal kleinere (maar niet minder belangrijke) zaken.
  • Om te beginnen hebben we al onze referenties herrenderd in hdr formaat. Dankzij het gebruik van de cluster heeft dit in plaats van een aantal weken slechts een tweetal dagen geduurd.
  • Dankzij deze referentie hebben we een aantal fouten in ons algoritme gevonden. Deze fouten bevonden zich vooral in fel belichte stukken, waar de fouten werden verdoezeld doordat er voordien werd geclampt (bijvoorbeeld bij lichtbronnen).
  • Buiten deze fouten hebben we nog een aantal kleine bugs gevonden in onze path sampler die ervoor zorgden dat de afbeelding een aantal promilles te helder was.
  • Verder zijn we ook bezig met het aanmaken en perfectioneren van een bidirectionele path sampler, die er voor zou moeten zorgen dat lastige paden (zoals caustics paden) vaker worden gesampled. Een van de problemen die we hadden was dat er een factor moest worden berekend wanneer bepaalde deelpaden met de camera werden verbonden. We hebben nu pas gevonden hoe deze factor exact berekend kan worden, wat belangrijk was voor een correcte implementatie van een bidirectionele path sampler. Er is echter nog werk aan de winkel om de sampler af en juist te krijgen.
  • Een ander interessant punt is dat we onze nieuwe mutatie (die in een van de vorige blogposts werd gedemonstreerd) hebben uitgebreid om toegepast te kunnen worden op meerdere soorten paden. Dit werk is nog niet volledig klaar (er zit nog ergens een foutje in), maar het grote werk is al klaar.

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.