Monday, April 14, 2008

Meer renderings probleempjes opgelost

Het probleem dat ik in mijn vorige post aanhaalde van de theta waarden die te groot werden bleek zich zelfs op 2 waarden voor te doen.


a) De ThetaOut (dus de hoek tussen de normaal in een vertex en de viewvector) ging van nul tot Pi ipv nul tot 90° zoals we zouden wensen Dit is opgelost door wanneer de z waarde van de view vector kleiner dan nul is Pi af te trekken.

b) De theta waarden die gebruikt worden om de environmentmap te samplen werd soms groter dan Pi aangezien de µ waarden er bij moeten opgeteld worden voor beide gaussfuncties. En aangezien de theta waarden zelf al tussen 0 en Pi liggen ligt het voor de hand dat als we hierbij waarden gaan optellen deze buiten het interval terecht kunnen komen. De oplossing hiervoor is gewoon modulo Pi te doen bij wijze van spreken aangezien het image in theta de hele cirkel beschrijft. (rechterkant van het image loopt dus over in de linkerkant).

Het resultaat van deze aanpassingen staat hieronder. Het is zichtbaar nog niet echt correct, het probleem met het inlezen van het texture blijft zich voor doen.
Op aanraden van mijn begeleider heb ik ook het formaat van het in te lezen texture veranderd van GL_HALF_FLOAT_NV naar GL_FLOAT (en alle halfs ook eerst geconverteerd naar floats uiteraard) Dit blijkt echter nog geen oplossing te zijn voor het probleem met het inlezen van het texture. Ik zoek uiteraard naarstig verder.

Toevoeging: inhoudstafel

Monday, April 7, 2008

Update \o/

Vooreerst, er zijn ondertussen echte environmentmaps opgemeten in een light booth. Dit is een toestel met een aantal lampen die een bepaalde standaard naleven. Dit wil zeggen dat het spectrum van deze belichting gekend is en dus ook kan gebruikt worden in mijn software. Behalve de environmentbelichting zelf hebben we ook 3 objecten in de booth geplaatst en deze gefotografeerd onder elke belichtingsconditie. Ook zijn de reflectantiespectra van de materialen/kleurvlakken op de voorwerpen opgemeten. Het doel hiervan is nu deze reflectantie - en lichtspectrumdata te gebruiken om de realiteit na te maken in mijn viewer. Dit zowel in RGB als spectraal om zodoende het onderlinge verschil als het verschil met de echte foto te kennen.

Noot: al deze foto's werden uiteraard in HDR genomen.

Dan de software zelf uiteraard. De volledige pipeline voor de environmentbelichting is ondertussen up and running. Maar nog niet bugfree spijtig genoeg.

Een eerste probleem dat ik tegen gekomen ben is dat ik views berekend heb voor een elevation angle tussen 0 en 90°. Maar als deze hoek berekend wordt zijn er natuurlijk ook regio's waar die hoek groter dan 90° is. Het diffuse gedeelte kan wel gespiegeld worden, maar hoe dit met het speculaire gedeelte zit is op dit moment nog een beetje wazig. Ter illustratie hieronder een theepot waarbij het gele stuk elevation angle [0-90°] en het magenta gedeelte is elevation angle (90-180°] Zoals in de verdere images te zien is zijn deze stukken op dit moment nog gewoon zwart.

Vervolgens staat er in de paper van Green et al. dat zij de gewichten, standaarddeviaties en µ-waarden in een texture steken om deze zo door te geven aan de shader. Ik heb enige problemen gehad met dat effectief te laten werken en heb er daarom voor geopteerd om deze door te geven als matrices. Deze kunnen ook heel efficient aangesproken worden binnen de shader en het komt goed uit aangezien er voor 15 views 16 waarden zijn per parameter. Dit komt dus net op een 4*4 matrix.

Hieronder een screenshot van een eerste test om een geconvolueerde environmentmap mappen op de theepot. Dit is gewoon gebruikmakend van de theta en phi hoek afgeleid uit de relfectievector.



Uiteraard is dit niet echt de bedoeling, dus toen heb ik dan de hele interpolatie pipeling geïmplementeerd. Iets wat sneller zou kunnen gaan moest ik tex2Dlod gebruiken, maar voorlopig wil ik alles goed kunnen volgen om dingen die fout gaan snel te kunnen spotten en isoleren. Het gevolg van renderen met specular en diffuse stukken apart staat hieronder. Eerst het specular gedeelte en de 2de is het diffuse stuk. Het valt natuurlijk direct op dat het magenta stuk uit het image hierboven nu nog zwart is. Andere dingen die hier nog fout waren zijn het zwarte gebied op de voorgrond en het ring effect aan de zijkanten.

Een combinatie van specular en diffuse stukken staat hieronder, eerst onder het toepassen van de scalering met gewichten, dan mét.



Het toepassen van de gewichten lost het probleem van het grote zwarte gebied in het midden al gedeeltelijk op, maar nog niet helemaal. (er moet hier ook wel vermeld worden dat er nog geen tonemapping is toegepast hier) Dus ben ik op zoek gegaan naar de plaatsen waar het fout loopt. Op dit moment zijn de problemen die ik gevonden heb:
- De theta waarden groter dan 90°
- Het laden van het .exr image. De variatie van de kleuren in de Y-richting (theta) is logisch maar er loopt iets serieus mis in de X-richting (phi)

Monday, March 3, 2008

Enkele BRDF plots

De eerste stap van de vorige post is onder tussen volledig in orde. Hier enkele plots.

De plots tonen een Blinn-phong model met een kijkhoek van respectievelijk 0°, 45° en 80° tov van de normaal. Op de Y-as staat de reflectantie, maximale puur diffuse reflectantie is er wanneer het licht evenwijdig met de normaal invalt. De diffuse component is onafhankelijk van de kijkrichting. De pieken duiden de phonglob aan, bij een phongfactor van 500 is deze duidelijk veel smaller dan wanneer deze 50 is. Op de X-as staat de hoek van het invallend licht, gaande van 0 tot Pi/2 (loodrecht op de normaal)

Er zijn ook 2 polarplots bij waarop duidelijker de lob te zien is.

Door de data is een som van gaussians gefit, in de meeste gevallen lijken 2 gaussfuncties voldoende te zijn om het model goed te fitten, vooral wanneer de diffuse en speculaire component goed te onderscheiden zijn. Bij de 0° plot is er gefit met 3 gaussians.

Ondertussen heb ik ook openEXR gecompileerd om op mijn machine te werken en heb ik een programmaatje geschreven dat .exr files inleest en de kleurcomponenten kan uitschrijven. Nu gebeurt dit als test van de methode met 3 channels, r, g en b. Maar dat is eenvoudig uit te breiden naar het spectrale geval. Ook moet het na de convolutie het image terug reconstrueren. Op dit moment ben ik aan het proberen om zowel de gaussfittings als de .exr data op de juiste manier voor te stellen zodat S2kit ze goed kan inlezen.

Als dat gedaan is moet er enkel een reflectionmapping uitgevoerd worden, iets dat simpel te doen is met Cg en openGL.


Als deze vorm van belichting werkt is het de bedoeling om de tonemapping te tweaken aangezien het op dit moment enkel adhv een puntlichtbron is gebeurd. Verder is het dan de bedoeling om een echte scene te fotograferen waarvan de belichtingscondities gekend zijn en deze trachten te moddeleren in de viewer om zodoende RGB, spectraal en realiteit te kunnen vergelijken.

Sunday, February 17, 2008

Environment Map Rendering

Zoals de titel zegt ben ik op dit moment bezig met het implementeren van environmentmap rendering. Het hele process is gebaseerd op deze paper en bestaat uit 3 stappen.

a) 15 kijkrichtingen nemen en daarvoor BRDF slices fitten op gaussians. In de paper neemt men er 3, ik zal er ook eerst 3 nemen. Later kan dan nog gekeken worden hoe groot het effect van meer of minder is. Op dit moment lukt het bepalen van de coëfficiënten van de gaussians voor een random fitting. alleen het berekenen van juiste brdf slices loopt op dit moment nog een beetje mank.

b) De gefitte brdf omzetten naar spherical harmonics en dan deze onmiddelijk convolueren met de environmentmap. De software om deze bewerking te doen is na veel proberen en omwegen uiteindelijk toch werkende geraakt op mijn Windows machine. Dus dit zou normaal gezien geen al te groot probleem mogen opleveren.

c) De resultaten in de openGL/C++ code brengen. De code voor het renderen van een backdrop (die dus de environment effectief showt is aanwezig, het eigenlijke belichten echter nog niet op dit moment.

Zoals gemerkt werkt het geheel nog niet volledig, maar het leek me nodig even een stand van zaken te geven om aan te duiden dat er weldegelijk verder gewerkt wordt. Ook heb ik tijdens de examens de bestaande code opgeruimd, nog enige foutjes er uit gehaald en stukken geoptimaliseerd.

Sunday, December 2, 2007

Tone mapping resultaten

Tone mapping

Tone mapping is het proces waarbij de HDR range wordt terug gebracht naar een LDR range. Enkele van de mogelijke technieken zijn in een vorige post al aan bod genkomen, maar nu dus ook effectief resultaten. De 2 reeds geïmplmenteerde tone mapping operators zijn die van Reinhard en de aangepaste Reinhard operator.

Hier wordt telkens het zelfde image getoond, eerst met gewoon de reinhard operator, dan de aangepaste reinhard operator met 8.0 als waarde voor de 'white luminance'.

Key value: 0.15




Key value : 0.3



Key value : 0.6







Thursday, November 15, 2007

Ashikhmin-Shirley Reflection Model

Ik heb vandaag dit model geïmplementeerd in RGB vorm. De spectrale versie zou voor morgen moeten zijn en zou niet zo veel problemen mogen opleveren.

Het model is nog vrij recent, de paper dateert uit 2000, en is een veel gesofisitceerder BRDF dan het eenvoudige phong model. Het houdt o.a rekening met energiebehoud en Fresnel effecten. Het voorziet anisotropische reflectie zodat het steperige effect dat op metalen kan voorkomen kan gesimuleerd worden.

Het model heeft 4 parameters waarmee het voorkomen kan aangepast worden. De diffuse en speculaire kleur en 2 parameters die vergeleken kunnen worden met de phong parameter. Het grootste probleem bij de implementatie was het genereren van de binormaal en raakvector per vertex. Maar uiteindelijk is er toch een redelijk mooi effect uitgekomen waarvan hieronder een voorbeeld.
Input:
Kd =1,0,0
Ks = 0.9,0.9,0.9
de 2 andere parameters: 100 en 10

In dit image is er ook een ambient licht van 0.3,0,0

Dit weekend hopelijk een spectrale versie.

Eindelijk mooie prentjes en een globale update

In de voorbije weken heb ik me vooral bezig gehouden met maken van de basis viewer. En ook de beloofde prentjes zijn hier uiteindelijk.

Deze heeft al enkele basisfunctionaliteiten zoals daar zijn:

a) Een kleur voorgesteld als een RGB triplet wordt omgezet dmv de methode van Smits. Dit wil zeggen dat een combinatie gemaakt wordt van de 7 basisfuncties en we voor de rest werken met 10 waarden ipv de standaard 3 voor rgb. De voordelen hiervan zijn direct duidelijk zoals ik ook op de presentatie getoond heb, voor de volledigheid staan die voorbeeldjes ook hieronder. Eerst een rode bol beschenen met een wit licht in rgb, dan diezelfde bol maar dan met een blauw licht. Op de 2de figuur is niks te zien wat logisch is aangezien we 1 0 0 en 0 0 1 gaan vermenigvuldigen wat resulteert in 0 0 0. Maar fysisch is dit uiteraard niet correct.


In het spectrale geval ziet dit er allemaal veel logischer uit zoals we hier onder zien. Aangezien de spectrale curves overlappen blijven er toch nog waarden over in het eindresultaat. De berekeningen worden hier in een vertex en fragment shader gedaan in de cg taal. Het berekenen van de kleur wordt in de fragment shader gedaan aangezien dat een gladder verloop geeft dan het per vertex berekenen.


b) Daarna heb ik het standaard phong model 'spectraal gemaakt' wat uiteindelijk wil zeggen dat de rgb waarden vervangen worden door een array van 10 waarden. Het resultaat is een shading die hetzelfde kleur probleem oplost als hier boven uiteraard en ook een specular highlight kan weergeven op het licht.


c) Aangezien het een viewer moet zijn is er ook functionaliteit om het object in kwestie te draaien en in/uit te zoomen. Op mijn PC thuis (met een GeForce 7800GT) haalt dit minimum een fps waarde van 60.

Verder heb ik ook geexperimenteerd met de FBO extension van openGL om zodoende een zekere vorm van tonemapping te kunnen doen. Het geen er gebeurd is dat de resultaten van het renderen met de shaders ipv naar het scherm naar de framebuffer gestuurd worden. Als ze dan eenmaal in deze buffer zitten kan ik er een waarde uithalen en deze gebruiken om een bewerking te doen op die data. De bewerking is dan het tonemappen. En deze veranderde gegevens worden dan op een quad 'geplakt' en zo naar het scherm gestuurd. Het resultaat is echt nog niet helemaal wat het moet zijn, dus ook nog geen prentjes.

De volgende stappen qua implementatie zullen zijn het Ashikhmin-Shirley Reflection Model trachten spectraal te implementeren als een gesofisticeerder BRDF en verder werken aan de tonemapping.

Aanvullende literatuurstudie

Aangezien het de bedoeling is dat er uiteindelijk gebruik gemaakt wordt van een environment map belichting en niet 1 puntlichtbron zoals nu het geval is heb ik enkele papers gelezen over dit onderwerp. Daaruit zal ik nu de 2 die het meest relevant lijken kort bespreken.

De eerste is "An Efficient Representation for Irradiance Environment Maps" (Ramamoorthi en Hanrahan) waarin ze diffuse object willen belichten met 'verre' belichting voorgesteld door environment maps. De basis van deze paper is dat de de irradiantie voorstellen als een som van sferische harmonische coëfficienten. Er wordt aangetoond dat de hogere frequenties weinig tot geen bijdrage leveren en daarom zijn de 9 eerste coëfficiënten voldoende om de irradiantie voor te stellen. Verder wordt deze voorstelling dan gebruikt om eerst via prefiltering de 9 corresponderende lichtcoëfficiënten te berekenen, daarna worden deze gebruikt voor een renderingsproces. De gemiddelde fout die het gebruiken van enkel 9 coëfficiënten induceert ligt onder de 1% en de grootste fout ligt onder de 5%.
Voor het renderingsproces wordt een eenvoudige matrix vermenigvuldiging opgesteld die de irradiantie berekent afhankelijk van de normaal. Dit zou heel snel moeten werken op de GPU aangezien deze geoptimaliseerd is voor o.a matrixbewerkingen.
Het nadeel van de techniek in deze paper (wat ze ook zelf aangeven in hun conclusie) is dat het enkel bedoelt is voor diffuse objecten. Daarom zal het waarschijnlijk niet voldoende zijn voor de thesis.

De 2de paper is eentje gerefereerd in de vorige met name: "A Unified Approach to Prefiltered Environment Maps" (Kautz et al.) Deze paper geeft eerst een algemene beschrijving van hoe een prefiltered environment map. Deze is dan vijfdimensionaal, 2 dimensies voor de kijkrichting en 3 om het coordinatenframe voor te stellen. Dan worden de gekende technieken op een rijtje gezet en hoe het aantal dimensies dan verlaagt. De technieken die men aanhaalt zijn diffuus, phong en 2 types van isotrope BRDF's. Bij die laatste is een belangrijk aspect dat de reflectielobes radiaal symmetrisch worden verondersteld.
Wat de paper nieuw aanbrengt zijn methodes om het prefilteren effectief uit te voeren. Men baseert zich op het feit dat prefilteren kan gezien worden als een filter die in de ruimte varieert. De waarden in de doelmap zijn de gewogen waarden uit de bronmap en voor het wegen wordt een filter gebruikt. En die filter is dan afhankelijk van de BRDF in kwestie. De filter varieert in de ruimte aangezien een filter op een bol altijd verschillende vormen aanneemt plus we mappen van een bol naar een rechthoek.
Het eerste model is een hierarchisch model, wat men in essentie doet is een mip-map maken van de bronmap en van de filter. Dan gaat men van het kleinste niveau beginnen en zo omhoog werken. Wanneer het vershcil tussen het lagere niveau en het volgende klein genoeg is zal men vermenigvuldigen met de corresponderende waarde uit de filter mip-map.
Het tweede model is specifiek gefit op de mogelijkheden van de hardware zodat men kan prefilteren 'on the fly'. Men gebruikt de cirkelvormige filter op een paraboloide map van de environment. Aangezien dit vervormingen geeft aan de randen naarmate de radius van de filter vergroot en de afstand tot het centrum zal men 2 keer prefilteren. Zowel met de grootste als de kleinste radius voor de filter en deze 2 dan blenden. In de paper wordt het wel enkel voor phong gebruikt aangezien dit voldoet aan alle voorwaarden voor de methode. Daarom dat het waarschijnlijk niet algemeen genoeg is om voor de thesis te gebruiken.