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.