Tuesday, April 22, 2008

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.