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.

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.

woensdag 26 november 2008

Nieuwe scenes

Om ons algoritme verder te testen hebben we een paar nieuwe scenes met lastige belichtingssituaties gemaakt. De eerste bevat een glazen "Stanford Bunny", waarmee we nagaan of ons algoritme met grotere aantallen primitieven (in dit geval ongeveer 70000) kan omgaan. Deze scene kan vooral ook gebruikt om de complexere caustics te evalueren.

Referentie met path tracer

Gerendert met Erpt (vrij lage kwaliteit en foute caustics)

Een tweede scene wordt de lichtbron en een box geplaats die enkel open is aan de bovenkant. De scene wordt hierdoor bijna alleen indirect verlicht.

Referentie met Path tracer

Gerenderd met ERPT in zelfde rekentijd

Voor de laatste scene kunnen we zien dat ERPT duidelijk beter presteert. Enkel de hoeken blijven een pijnpunt.

Debug tijd: Speculaire objecten

We zijn er in geslaagd om voor lens perturbations de acceptance probability op een correcte manier te evalueren. Voor caustic perturbations is dit echter niet gelukt. We hebben de auteurs van de relevante papers gecontacteerd om meer inzicht te krijgen in deze materie, maar hebben tot nu toe geen bevredigend antwoord gekregen. Voorlopig zitten we daar klem. Als alternatief gaan we een ander soort mutatie implementeren (zie een latere blog post).

We geven nog enkele afbeeldingen die gebruik maken van onze verbeterde lens perturbations. We zien enkel de paden van de vorm ESD... en ESSD... Een aantal types paden ontbreken, maar om de correctheid van lens perturbations vast te stellen is dit voldoende.


Referentie door pathtracer



Afbeelding gerendert met Erpt

We zien dat qua belichting de twee beelden nagenoeg identiek zijn op een paar artifacten na. We zien ook dat het beeld gerenderd door Erpt veel minder ruis bevat voor ongeveer de zelfde rekentijd. Gelijkaardige tests voor de caustic perturbations zijn helaas gefaald.

woensdag 19 november 2008

Debug tijd : Diffuse scenes

Na het correct evalueren van de directe belichting bleek het vrij eenvoudig om op een correcte manier diffuse scenes te renderen (inclusief indirecte belichting).


Diffuse scene gerenderd met onze ERPT implementatie.

Diffuse scene gerenderd met een standaard path tracer

Deze scenes zijn nagenoeg gelijk. Bij ERPT zien we in de hoeken nog te heldere pixels. Deze artifacts zijn inherent aan het algoritme, en dus moeilijk te verwijderen op een elegante manier. Ze zijn een gevolg van een zeer grote geometrische term in het oorspronkelijk pad, waardoor de acceptance probability van mutaties zeer laag is. Hierdoor blijft het pad steeds in dezelfde pixel, en zet het daar al zijn energie af.

Op deze moment zijn we nog bezig met het aanpassen van de acceptance probabilities voor paden die speculaire nodes bevatten. To be continued...

Debug tijd : Directe belichting

Bij het vergelijken van de resultaten van ons ERPT algoritme met die van een path tracer, zijn we tot de conclusie gekomen dat de belichting fout was. Om de fout in onze implementatie te vinden hebben we op een systematische manier de mutaties gedebugd. We zijn hiermee begonnen door enkel directe belichting in overweging te nemen. Dit is een van de eerdere resultaten :


Afbeelding gerenderd met foutieve ERPT implementatie.

Hier is te zien dat de belichting geconcentreerd is in het midden van de muren. De sterkte en grootte van de lichtvlekken zijn afhankelijk van de perturbatie grootte. Om dit heel duidelijk te maken hebben we een zeer grote perturbatie gekozen. De volgende afbeelding is een reference image, gerenderd met een standaard path tracer. Dit is hoe de directe belichting er uit zou moeten zien :


Afbeelding gerenderd met een path tracer

Onze conclusie was dat er iets fout was met de waarschijnlijkheid waarmee mutaties aanvaard worden. Mutaties naar het centrum van de muren toe werden meer aanvaard dan zou mogen. Het voorgaande ging enkel over caustic perturbations, maar lens perturbations vertoonden ook gelijkaardige problemen.

Bij het nader bekijken van de formules voor het berekenen van de acceptance probabilities in de relevante papers, bleek dat deze formules niet consistent zijn. Het is ook moeilijk om de oorsprong van deze formules te achterhalen. In een poging om meer duidelijkheid te scheppen hebben we de schrijvers van de ERPT paper gecontacteerd. Op basis van hun advies en onze eigen intuïtie zijn we er in geslaagd om juiste resultaten te verkrijgen in het geval van directe belichting. Deze resultaten zijn nagenoeg gelijk aan dat van de path tracer (op wat ruis na).

woensdag 12 november 2008

Eerste resultaten ERPT

De volgende mijlpaal bij het implementeren van PMC-ER is het maken van een werkende ERPT implementatie. Door dit te doen kunnen we onze mutatie code vroeger debuggen. Deze week hebben we ons daarmee bezig gehouden. Dit zijn de eerste resultaten :

Rendertijd : ongeveer 3 minuten

Op de platte oppervlakken is het te zien dat er over het algemeen minder ruis is, maar dat er wel vlekken en clusters voor in de plaats zijn gekomen. Deze ruis is het sterkst aanwezig in hoeken en grensvlakken.
Rendertijd : ongeveer 35 minuten

In deze afbeelding is nog steeds ruis in de hoeken te zien, maar de oppervlakken zijn wel mooi 'glad'. Verder is de rendering op bepaalde plaatsen nog iets te donker, wat er op wijst dat er nog enkele foutjes in de code zitten. Deze week gaan we ons vooral bezighouden met het debuggen van de mutatiecode.
Rendertijd : ongeveer 45 minuten

In deze rendering zien we dat de caustics aanwezig zijn (al zien ze er niet uit zoals ze moeten). Ook de reflectie en de refractie zijn min of meer geslaagd en bevatten relatief weinig ruis. Toch zijn er nog een aantal fouten te zien : Vlekken op de muren, slecht gevormde caustics, te heldere reflecties, en op sommige plekken is de afbeelding weer te donker.

Zoals reeds vermeld gaan we deze week proberen om de oorzaken van deze fouten te vinden (en op te lossen). Verder gaan we ook nog wat experimenteren met de parameters van het algoritme om te zien wat de beste resultaten geeft.

woensdag 5 november 2008

Updates implementatie

In onze vorige post hebben we het resultaat van een eenvoudige pathtracer (volgens de path integraal formulering) getoond. Bij het vergelijken ervan met reference images gerenderd met een standaard path tracer hebben we echter gemerkt dat het resultaat niet volledig overeen kwam. De randen van de afbeelding bleken onder andere te licht te zijn. We vermoeden dat dit komt doordat de pdf niet altijd juist geevalueerd werd.

De laatste week hebben we onder andere een nieuwe path sampling methode geschreven. Deze werkt ongeveer als volgt :
  • Een path wordt geconstrueerd in de scene en beëindigd met russian roulette.
  • Vervolgens proberen we elke node in dit path expliciet met een lichtbron te verbinden.
  • We checken dan of het resulterende path geldig is : of het licht de camera wel kan bereiken.
  • Uit alle geldige paden kiezen we er willekeurig een uit.
Deze methode heeft als voordeel dat er met grotere kans een geldig path wordt gekozen, en de pdf's zijn eenvoudig te berekenen. Nadeel is dat er iets te veel werk wordt uitgevoer voor paden die later niet gaan worden gekozen. Dit is echter geen al te groot probleem, omdat slechts een klein deel van de paden die geëvalueerd gaan worden op deze manier worden aangemaakt.

Hier is een rendering die gebruikt maakt van deze sampling methode. Links is de afbeelding gerenderd met onze nieuwe path sampler.







Dit is een afbeelding van ongeveer dezelfde kwaliteit, gerenderd met een standaard geoptimaliseerde path tracer. (implementatie van PBRT)







Verder hebben we ook een aantal andere zaken gedaan deze week zoals het begin van de implementatie van lens perturbaties.

woensdag 29 oktober 2008

Eerste fase implementatie

De eerste fase van de implementatie was het implementeren van een simpele path tracer. Het verschil met een gewone path tracer is echter dat we eerst actief een path construeren, en dat daarna evalueren. Een path is hierbij gelijk aan
  • Een punt op de camera lens
  • Een aantal diffuse / speculaire botsingen
  • Een punt op een lichtbron
Dit algoritme is natuurlijk inefficiënter dan een gewone, geoptimaliseerde path tracer, maar het vormt wel de basis voor de rest van het algoritme. Belangrijke zaken die we bij PMC-ER gaan nodig hebben zijn immers
  • Path sampling
  • Path evaluatie
welke nu beide geïmplementeerd en getest zijn.

Het resultaat kan hier worden gezien :


Een aantal andere zaken die we hebben gedaan zijn
  • De high-level structuur van het algoritme geïmplementeerd : loopen over iteraties, bepalen hoeveel paden moeten worden geëlimineerd/geregenereerd, ...
  • Stratified Sampling over het Image Plane
  • Het normaliseren van de afgezette energiewaarden. Bij een gewone path tracer gebeurt dit per pixel. Bij ons algoritme moet dit gebeuren over het hele image plane.
De volgende stappen voor het implementeren van PMC-ER zijn nu :
  • Schatten van de gemiddelde energie per path E, en de waarde ed.
  • Het afzetten van energie op het Image Plane
  • Het implementeren en evalueren van mutaties op paden.
Hierna kunnen we een versie van het ERPT algoritme construeren, zodat we opnieuw onze code kunnen testen.

dinsdag 14 oktober 2008

Verslag deze week

Deze week hebben we vooral de papers over MLT (Metropolis Light Transport), ERPT (Energy Redistribution Path Tracing) en PMC-ER (Population Monte-Carlo Energy Redistribution) bekenen.

MLT zal door middel van mutaties paden met een grote bijdrage die moeilijk te vinden zijn grondiger onderzoeken. Voor scenes met lastige belichting (sterke indirecte belichting, (onrechtstreeks waargenomen) caustics, ...) heeft dit een veel betere convergentie tot gevolg.

ERPT tracht een van de zwakke punten van MLT, de startup bias, op te lossen. Concreet betekent startup bias in het geval van MLT dat er veel samples moeten genomen worden vooraleer de verwachte waarde van de schatter de oplossing genoeg benadert. Door een gewone path tracer uit te breiden met mutaties in ERPT, wordt de startup bias geelimineerd, terwijl ze toch het lokaal onderzoeken van interessante lichtpaden blijft ondersteunen. De term Energy Redistribution komt voort uit het feit dat een filter wordt gebruikt om informatie uit pader te verdelen over verschillende pixels (op een unbiased manier).

Bij ERPT worden echter een aantal belangrijke parameters vastgelegd, zoals de grootte van de perturbaties op paden. Dit is niet optimaal. Paden die bijvoorbeeld op schaduwgrenzen uitkomen zouden kleinere mutaties moeten krijgen dan paden die bijvoorbeeld in het midden van een diffuus vlak vallen. PMC-ER gaat er voor zorgen dat het algoritme zelf deze parameters aanpast.

Het algoritme werkt in grote lijnen als volgt : Het algoritme verloopt in verschillende iteraties. Er wordt een populatie van n paden bijgehouden die elk een zeker hoeveelheid energie bevatten. Elke iteratie wordt Energie uit deze paden door middel van mutaties en een ER filter verdeeld over verschillende pixels. Paden die reeds goed onderzocht zijn (die al veel energie op het beeld hebben afgezet) en paden die slechts een kleine bijdrage aan het beeld leveren, hebben een grotere kans om na elke iteratie tijdens een resampling stap te worden vervangen door nieuwe paden. In het begin van elke iteratie worden de parameters op basis van de vorige iteraties ingesteld.

We gaan voor deze thesis proberen PMC-ER te implementeren.

PBRT werkt !

Een aantal dagen geleden is het gelukt om PBRT te compileren op Windows met Visual Studio 2008. Hier is de eerste render met PBRT (simple.pbrt file) :

Nu rest alleen nog de taak om een nieuw algoritme te implementeren. Daarover meer in de volgende post.

woensdag 1 oktober 2008

Interessante papers

We hebben een aantal papers geselecteerd die ons interessant lijken :
  • Metropolis Light Transfer : paper
    Dit is een unbiased techniek die voortbouwt op (bidirectional) path tracing, en Metropolis sampling en path mutaties gebruikt om interessante lichtpaden te selecteren.
  • ERPT : paper
    Dit algoritme is gelijkaardig aan MLT, maar gebruikt Energy Redistribution sampling om de rendering equation op te lossen. ERPT is ook unbiased.
  • PMC-ER : paper
    Dit algoritme is gelijkaardig aan ERPT, maar het gebruikt het Population Monte Carlo framework om de render efficientie te verbeteren. Dit is de meest recente techniek (2007) van de drie en lijkt ons dus het interessantst.
  • Multidimensional Lightcuts : paper
    Dit algoritme is een uitbreiding van het lightcuts algoritme waarbij niet enkel een light tree wordt geconstrueerd, maar per pixel ook een gather tree. Van de combinatie van die twee trees kunnen dan cuts worden genomen.
  • Re-Using Paths : paper
    Dit algoritme versnelt path tracing door paden te hergebruiken. Op die manier levert elk light path een bijdrage aan verschillende screen pixels.

Eerste conclusies van literatuurstudie

Op basis van de papers die we gelezen hebben kunnen we het Global Illumination domein op verschillende manieren indelen. Een van deze manieren is het onderscheid tussen biased en unbiased algoritmen.
  • Bij biased algoritmen wordt correctheid opgeofferd aan minimale rekentijd. Bias wil concreet zeggen dat de verwachte waarde van de schatter niet gelijk is aan de oplossing van de rendering equation. Sommige van deze technieken kunnen onder andere gebruikt worden voor interactieve toepassingen.
  • Unbiased technieken daarentegen specialiseren zich in het berekenen van de correcte oplossing van de rendering equation (dus waarbij de verwachte waarde van de schatter niet afwijkt van die van de integraal). Dit zijn meestal variaties en uitbreidingen op het klassieke path tracing algoritme. Dit algoritme wordt in recente algoritmen uitgebreid met variantie reductie en path reuse technieken. Voorbeelden van variantie reductie technieken zijn importance sampling en adaptive sampling. Path reuse algoritmes gaan rekentijd uitsparen door bepaalde paden of deelpaden te herbruiken.
Concrete en bekende voorbeelden van unbiased algoritmen zijn 'bidirectional path tracing' en 'Metropolis Light Transport'. Veel van de recentste technieken zijn gelijkaardig aan Metropolis Light Transport, maar brengen aanzienlijke verbeteringen.

Voorlopig zijn we van plan om een recent unbiased algoritme te selecteren voor onze thesis. In een volgende post zullen we een aantal mogelijke kandidaten bespreken.

Welkom

Welkom op onze thesis blog. Hier gaan wij de vooruitgang van onze thesis weergeven.

Het thema van onze thesis is 'Geavanceerde Globale Belichting'. Dit is natuurlijk een ruim vakgebied, dus de eerste stap is het selecteren van een interessant algoritme om te implementeren. Het is de bedoeling om dit algoritme als plug-in in PBRT implementeren. Daarna kunnen we eventueel nog een aantal kleine aanpassingen maken of optimalisaties toevoegen.