Welcome
Det har varit lite tyst om renderaren nu ett tag, men det är inte för att jag inte hållt på med den. Tvärtom. Jag har upptäckt en massa buggar men kanske främst kämpat med att göra om raytracern från sk "path tracing" som kräver sjukt mycket strålar för att bli brusfri, till en mer deterministisk/ordinär "Whitted raytracer". Istället för spekulärt djup där man terminerar strålgången efter ett antal studsar så gör jag istället så att jag avbryter när ljusintensiteten i strålen blivit så låg att den knappt ger något visuellt bidrag.
Raytracingsteget går lite långsammare, men i gengäld försvinner bruset helt och det blir likt originalidén med SPPM.
Denna förändring gjorde dock att det blir jäkligt knepigt med nästlade dielektriska material när en raytracead stråle blir ett fett strålträd som skapar en massa olika diffusa träffar, vilket gjorde kärnan i SPPM-beräkningen svåranvänd, eg omöjlig om jag får säga det. Originalidén är nämligen att man avbryter raytracingen vid en diffus träff och sparar en "hitpoint" med 3dpunkten, normalen och spektralfördelningen - men det blir jäkligt konstigt när en stråle bryts upp i flera när den både går igenom glas och reflekteras samtidigt. Strålen kommer träffa flera olika diffusa ytor, så första idén blev att spara alla dessa diffusa träffar. Efter några iterationer blev minnet fullt.
Efter en sömnlös natt med grubblande så mindes jag att jag läst om några som vidareutvecklat SPPM så att man slipper spara hitpointsen vilket ju då kringår hela problematiken helt. Det tog mig bara en förmiddag att implementera idén, och det mesta av implementeringen bestod egentligen av att skala bort delar av originalkärnan istället för att utöka den.
Avhandlingen heter "Progressive Photon Mapping: A Probabilistic Approach" av
Claude Knaus and Matthias Zwicker: http://www.cgg.unibe.ch/publications/2011/progressive-photon-mapping-a-probabilistic-approach
Mest av tiden har gått åt att debugga refraktionsindex och fresnelberäkningar samt att få Whittedraytracern att funka.
Jag har trott många gånger under de senaste veckorna att jag varit i hamn med raytracern. Precis som nu. Skillnaden nu är att jag har svårt att hitta visuella konstigheter och jag tycker koden blivit rejält mycket snyggare med en massa JUnit-test för refraktionsindexlistan som används för att ljusstrålen ska lista ut i vilket material den förnärvarande befinner sig i, implementerad enligt "Simple Nested Dielectrics In Ray Traced Image" av Charles M. Schmidt and Brian Budge: http://www.idav.ucdavis.edu/func/return_pdf?pub_id=772
My permuted Halton sequence for sampling the photons made a "cloud"-pattern of indirect hits on the walls. This picture was rendered with a plain Mersenne-twister making the indirect light much smoother with just a couple of iterations with 50000 photons with an initial radius of 5 cm and an alpha-value of 0.7. Still using one single radius instead of storing individual radii with each hit.
I also got "polka dots" on the walls because of photons with insane intensity, but with a bit of tinkering with the y-values of the reflection/refraction-distributions they disappeared. Now a each deposited photon is always less or equal to what it was initially generated with.
Now I also use Beer-Lambert's law to attenuate the photons when traveling through dielectric media. Not visible on this small tank though. I currently use one single attenuation coefficient for all wavelengths, but will use full spectral attenuation when I have found good data. This was a really good article about it with some data for seawater: http://partialgeek.net/2010/03/26/physically-based-absorption-in-luxrender/.
The final frontier would be implementing dispersion. The fresnel equations makes the transitions between full internal reflection a bit too sharp and aquariums are littered with nice rainbow phenomenons when you know where to look. Unfortunately this would also make the raytrace very noisy and time consuming so I think I will skip it.
So know the work with making a user friendly GUI will begin and couple it to Google Appengine for storing reflector profiles and spectral data. I don't look forward to it. Especially not the reflector-profile-editor..
The picture is rendered in about 20 minutes with 2000000 photons and 2,4 Ghz without multi threading, but you get a really nice view of the scene in just one iteration in about 20-40 seconds. You'll want 3-4 iterations to get nice anti-alising though.
[2013-4] [2013-3] [2012-5] [2012-3] [2012-1] [2011-12] [2011-8] [2011-5] [2011-4] [2011-3] [2011-2] [2011-1] [2010-12] [2010-11] [2010-10] [2010-9] [2010-8] [2010-7] [2010-6] [2010-5] [2010-4] [2010-3] [2010-2] [2010-1] [2009-12] [2009-11] [2009-10] [2009-9] [2009-8] [2009-7] [2009-6] [2009-5] [2009-4] [2009-3] [2009-2] [2009-1] [2008-12] [2008-11] [2008-10] [2008-9] [2008-8] [2008-7] [2008-6] [2008-5] [2008-4] [2008-3] [2008-2] [2008-1] [2007-12] [2007-11] [2007-10] [2007-9] [2007-8] [2007-7] [2007-6] [2007-5] [2007-4] [2007-3] [2007-2] [2007-1] [2006-12] [2006-11] [2006-10] [2006-9] [2006-8] [2006-7] [2006-6] [2006-5] [2006-4] [2006-3] [2006-2] [2006-1] [2005-12] [2005-11] [2005-10] [2005-9] [2005-8] [2005-7] [2005-6] [2005-5] [2005-4] [2005-3] [2005-2] [2005-1] [2004-12] [2004-11] [2004-10] [2004-9] [2004-8] [2004-7] [2004-6] [2004-5] [2004-4] [2004-3] [2004-2] [2004-1] [2003-12] [2003-11] [2003-10] [2003-9]