woensdag 26 november 2008

Bug Fix

Op aanraden van Ares heb ik een beetje tijd gespendeerd aan mijn "gaten in de meshes" bug zodat ik verder kan werken met een ray tracer waarvan ik 100% weet dat hij correct werkt.

Na een halve dag intensief zoeken heb ik de bug gevonden op een plaats waar ik het totaal niet verwachtte (zoals met alle bugs het geval is) in de code voor het bouwen van een bounding box van een driehoek:

min(a.z, b.z, b.z), max(a.z, b.z, c.z) // fout door stomme tikfout
min(a.z, b.z, c.z), max(a.z, b.z, c.z)) // correct

Het gevolg hiervan was dat een (klein) aantal bounding boxes fout werd berekend en daarom werden sommige driehoeken niet getest wat leidde tot gaten in de meshes. Gelukkig is dit probleem nu van de baan zoals volgende renders aantonen.
Image and video hosting by TinyPic
Een schokkerige versie van Achmed the dead terrorist :)
Image and video hosting by TinyPic
En de classroom scene met een perfecte muur achteraan

Verder waren niet al mijn berekende statistieken even nuttig, zoals bijvoorbeeld het aantal driehoek / straal intersecties per straal. Beter is om het aantal driehoek/straal intersecties te verdelen over stralen die iets geraakt hebben.

























































































BVH STATS WITH FTB TRAVERSAL AND CULLING







scene

#triangles

#tris/hit

#box/hit

build (s)

render (s)







ulm box

492

2.54

32.16

0

2







classroom

9K

3.9

118

0

9







office

34K

5.39

71.5

0

6







cabin

219K

7.75

155

0

12







armadillo

345K

3.27

87.5

2

2







atrium2

559K

8.54

142.9

2

12







conference

987K

4.17

145.8

6

11







cruiser

3.64M

12.6

137.5

23

10







dragon

7.22M

3.65

114

38

1





De bugfix heeft het aantal straal/driehoek intersecties iets verminderd, het belangrijkste is dat ik nu zeker weet dat alles correct werkt, nu kan ik mij focussen op rauwe performantie.

zaterdag 22 november 2008

Cal3d Werkt

Na weken van hier en daar wat experimenteren, rommelen en prullen met Cal3d dacht ik vanmiddag, nu stop ik niet meer tot het werkt. Het heeft me de rest van de dag gekost maar het is me eindelijk gelukt om animaties te renderen met mijn ray tracer.

Het laten aan mekaar vloeien van animaties heb ik nog niet helemaal door maar het belangrijkste is dat het werkt. Dus meet Cally en Bones.Image and video hosting by TinyPic
Image and video hosting by TinyPicEr zitten nog een paar foutjes in, bijvoorbeeld Cally heeft soms gaten in haar meshes waardoor het lijkt alsof ze beschoten is met een machinegeweer.

Framerates komen er nog aan.

dinsdag 18 november 2008

Front-To-Back Traversal & Culling

Op aanraden van Ares heb ik front-to-back traversal en culling in mijn ray tracer geïmplementeerd. Hoewel de principes niet moeilijk zijn zal ik voor de niet ingewijden een korte uitleg geven.

Front-to-back traversal komt erop neer dat we onze BVH hierarchy proberen te doorlopen in de volgorde zoals we de hierarchy "zien" vanuit de straal. In mijn oude code werd er gewoon altijd eerst links doorlopen en dan rechts. Het plaatje zou alles moeten verduidelijken.



Front-to-back traversal doet in principe nog altijd hetzelfde werk als eerst links en dan rechts doorlopen. Het wordt pas interessant wanneer we dit gaan gebruiken voor "culling".

Het idee hier is dat wanneer we in Box 1 een intersectie met een driehoek hebben gevonden en daarna berekenen we de intersectie met Box 2 dan vinden we dat deze verder ligt. Aangezien alles wat in Box 2 zit dan ook verder zit moeten we dat niet meer bekijken.



In de bovenstaande figuur moeten we de inhoud van Box 2 niet meer controleren dat bespaart ons 2 straal/driehoek intersecties of grofweg de helft van het werk (herinner dat straal/driehoek intersecties veel duurder zijn dan straal/boundingbox intersecties, in mijn implementatie ruw geschat een factor 7 a 8). Dit is natuurlijk niet altijd zo maar er zullen veel gevallen zijn waar we maar 1 van de 2 boxen moeten helemaal testen en dus maar de helft van het werk doen.

Dat geeft ons dan de volgende statistieken:

BVH STATS WITH FTB TRAVERSAL AND CULLING 

scene 

#triangles 

#tris/ray 

#box/ray 

build (s) 

render (s) 

ulm box 

492 

3.09 

31.11 

classroom 

9K 

6.53 

157.5 

office 

34K 

7.42 

98.17 

 

cabin 

219K 

11.29 

210.65 

12 

armadillo 

345K 

1.15 

30.86 

atrium2 

559K 

10.89 

211.72 

12 

conference 

987K 

6.73 

199.95 

10 

cruiser 

3.64M 

16.87 

171.12 

16 

10 

dragon 

7.22M 

0.8 

24.59 

24 



Wat duidelijk opvalt in vergelijking met de vorige post is dat het aantal straal/driehoek intersecties voor sommige scenes tot de helft is gezakt, als dat geen mooi bewijs is dat de implementatie werkt! Dit uit zich ook in de rendertijden die voor het gros van de scenes gehalveerd is.

Ik denk persoonlijk dat ik bijna alles uit deze simpele BVH met median split structuur gehaald heb wat eruit te halen valt en dat het tijd is voor de zwaardere middelen. Tenzij Ares maandag nog enkele tips heeft :)

Nieuwe Aura's

Voor mijn aura's heb ik het rgb kleurmodel veranderd naar het hsv kleurenmodel. Door de parameter h (hue) aan te passen kan ik nu het kleurenverloop in de afbeelding mooi laten van variëren van groen tot rood. Een groene pixel heeft (relatief) weinig werk gekost, een rode pixel heeft veel werk gekost.

Er is niet direct nut hiervan in mijn thesis maar het is wel handig voor het debuggen en optimaliseren. En ik heb mooie prentjes voor op mijn blog :p











Het aantal driehoek/straal intersecties was fout in mijn vorige posts, ik maakte hier een gewogen gemiddelde van het aantal driehoek/straal intersecties en het aantal boundingbox/straal intersecties. De volgende cijfers zijn wel correct voor de standaardimplementatie:

BVH STATS WITH STANDARD IMPLEMENTATION 

scene 

#triangles 

#tris/ray 

#box/ray 

build (s) 

render (s) 

ulm box 

492 

3.48 

34.2 

classroom 

9K 

11.39 

198.75 

12 

office 

34K 

12.82 

118.52 

cabin 

219K 

23.1 

258.6 

16 

armadillo 

345K 

2.66 

55.17 

atrium2 

559K 

14.73 

245.1 

22 

conference 

987K 

10.61 

234.6 

21 

cruiser 

3.64M 

35.62 

356.23 

23 

33 

dragon 

7.22M 

2.28 

65.1 

38 



Er is duidelijk iets mis met deze tabel maar gelukkig zijn de waarden wel leesbaar. De tabelondersteuning in blogger is echt wel crappy.

Status Update

De eerste status update sinds 2 weken. Zoals jullie ondertussen allemaal weten is het maandag dus een afspraak met Ares.

Eerst en vooral moet ik deze week verder werken aan mijn BVH's, concreet moet ik het doorlopen van de hierarchie optimaliseren. Een eerste optimalisatie is het front to back doorlopen van de hierarchy, hierdoor is de eerste hit meteen ook de juiste. Een tweede optimalisatie is culling, hier probeer je delen van de boom gewoon over te slaan bij traversal. Voorlopig ga ik niet meer kijken naar mijn SAH implementatie todat de BVH volledig op punt staat.

Om de performantiewinst van mijn optimalisaties te bepalen is het belangrijk om genoeg gegevens te verzamelen in mijn ray tracer. Om die gegevens te visualiseren ga ik een apart tooltje maken dat prachtige aura's maakt.

De fouten in de plaatjes van mijn OpenGL tool komen volgens Ares waarschijnlijk omdat ik geen z-buffer gebruik en door backface culling. Normaal zou ik dat probleem in korte tijd moeten kunnen fixen.

zaterdag 15 november 2008

OpenGL Tool

Deze week is het redelijk rustig geweest wegens enkele andere deadlines. Nu het weekend is kunnen we terug een beetje proberen op kruissnelheid te komen.

Na een maand BVH's te coden en te debuggen ben ik dat een beetje beu dus tijd om de Cal3d library werkende te krijgen dacht ik zo. Helaas de cal3d library werkt nog altijd niet :( Er is ook een positieve kant aan. Om te controleren of de fout ligt bij de Cal3d code waar ik aan bezig ben of aan mijn eigen ray tracer heb ik een toolje geschreven om mijn scenes ook te renderen met rasterisatie. Wie tijd teveel heeft kan het eens nalezen op Wikipedia.

Concreet maak ik hiervoor gebruik van de OpenGL API. Na slechts één tutorial door te nemen is het al gelukt om iets redelijk deftig te schrijven. Met deftig bedoel ik, voor mij werkt het goed genoeg. In sommige plaatjes zitten wel foutjes, waarom weet ik niet.

De Soda scene gerendered met mijn tooltje:



Wat ik er nog zou willen insteken is het visualiseren van bounding boxes en stralen.

donderdag 6 november 2008

Presentaties

Gisterennamiddag en deze namiddag heeft elke thesisstudent van de graphics groep een korte presentatie gehouden over het onderwerp van zijn thesis mezelf inclusief. Ik was redelijk zenuwachtig maar uiteindelijk is de presentatie vlot verlopen, mijn t-shirt kon je wel uitwringen achteraf :) Helaas kan ik mijn presentatie niet online zetten omdat blogger alleen maar afbeeldingen toelaat.

EDIT: Dankzij een nuttige tip van Davy staan nu ook mijn slides online.

Ik heb veel gestolen met mijn ogen maar 1 idee van Frederic De Pourcq vond ik heel cool namenlijk "aura's". Dan heb ik het niet over aura's in de context van energievelden leren zien, chakra's en andere kwakzalverij. Het idee is om elke pixel te kleuren naargelang de hoeveelheid werk die nodig was om die pixel te berekenen, met hoeveelheid werk bedoel ik dan straal/driehoek intersecties.

Het idee is veel beter dan tabellen opstellen (zoals ik een paar posts geleden deed) omdat je nu direct een visuele indruk krijgt van de complexiteit van een scene en de kwaliteit van een versnellingsstructuur. Zo'n aura geeft alleen maar een visuele indruk en is geen rigoureus bewijs voor kwaliteit e.d. maar het is wel handig.

Daarnet heb ik het zelf in mijn ray tracer proberen te integreren, in sommige plaatjes zitten wat foutjes maar het idee is er wel, misschien kan ik zo een verklaring vinden voor de slechte rendertijd van de attrium scene.

Hoe dieproder de kleur van een pixel heeft des te meer werk heeft het gekost om die pixel te berekenen. Ideaal zouden we afbeeldingen willen met lokaal een beetje rood maar overwegend zwart.

Het aura van het Attrium:


De Ulm box


De Soda hall

De office scene

de classroom

de asian dragon
armadillo

Ik ga het in mijn ray tracer laten zitten met conditional compilation, zo kan ik het er terug uithalen wanneer ik wens. Mijn inziens gaat dit nog heel handig zijn bij het debuggen van versnellingsstructuren.

dinsdag 4 november 2008

Benchmarks

Zoals gisteren beloofd enkele benchmarks op een resolutie van 1024 x 1024 pixels zodat we eens deftig kunnen vergelijken met andere implementaties.

Scene

#driehoeken

Tijd (seconden)

#intersecties/straal

Ulm box

492

3

9.55

Classroom

9250

14

44.519

Office

34.000

8

25.78

Soda

141.636

12

52.11

Cabin

219.435

17

48.08

Armadillo

345.944

4

8.57

Atrium

559.992

1215

111.27

Conference

721.945

15

30.296

Cruiser

3.636.291

24

73.01

Asian Dragon

7.219.045

5

10.15



Om een obscure reden rendert het atrium nog altijd veel langer als de rest van de scenes. Zoals Ares reeds voorspeld had is het aantal driehoek/straal intersecties sterk gedaald.

De build time voor de versnellingsstructuren is niet bijgerekend daarom zal ik deze een van de volgende dagen ook posten.

maandag 3 november 2008

Bounding Volumes Part IV

Na mijn gesprek met Ares heb ik ter experiment een simpelere referentieimplementatie gebouwd van mijn bounding volume hierarchy. In deze nieuwe implementatie houd ik de 2 kindknopen naast elkaar bij in een array. Door opnieuw te implementeren heb ik een aantal bugs gevonden in mijn boundingbox code: elke boundingbox bevatte sowieso de oorsprong, met als gevolg dat de meetste bounding boxes veel te groot waren. Verder heb ik nog een paar kleine aanpassingen gedaan in mijn code. Het resultaat is dat mijn code 2 ordegroottes sneller is !!!! Halleluja, ik vermoed dat het aan mijn bounding boxes ligt maar dat kan ik niet met zekerheid zeggen omdat ik ook in mijn median split algoritme aanpassingen heb gedaan.

Het geeft een wrang gevoel wetende dat je meer dan een week verspild heb aan een nutteloze implementatie. De les: eerst een simpel algoritme bouwen en dan gradueel verfijnen in plaats van een superoptimale implementatie maken die nooit werkt omdat je toch de complexiteit niet kan beheersen! Deze quote van Ken Thompson (B language, UNIX, Plan 9) vat perfect mijn dag samen: "One of my most productive days was throwing away 1000 lines of code.".

En de rendertijden:

figuur#driehoeken#seconde
office34000<>
soda hall141.6361
cabin219.4351
armadillo345.9441
attrium559.992104
asian dragon72190451
conference987.5221
cruiser3.636.2912



en de plaatjes (cruiser, conference, dragon, attrium, armadillo):





De eerlijkheid gebied me te zeggen dat het bouwen van de bvh tree ook een paar secondjes kost.

Morgen zal ik deze allemaal renderen op een resolutie van 1024x1024 pixels zodat we eens deftig kunnen vergelijken.

Waarom het attrium zo traag rendert weet ik nog niet.

Status update

Een nieuwe maandag dus een afspraak met Ares. Het belangrijkste onderwerp van ons gesprek was natuurlijk de veel te trage BVH. Na samen de tabel met statistieken te hebben bekeken heb ik van Ares de tip gekregen om toch maar eens naar mijn traversal code te kijken (de code die de boom doorloopt) omdat ik veel te veel driehoek/straal intersecties doe per straal.

Het 2e deel van ons gesprek ging over de draft van mijn presentatie van donderdag. Mijn presentatie heeft op dit moment veel weg van een opsomming terwijl ik één vloeiend verhaal zou moeten vertellen. Dus nog een beetje werk tegen donderdag.

Dus deze week debuggen en presentatie!

zondag 2 november 2008

SAH bounding volume hierarchy

Het is me gelukt om mijn bounding volume hierarchy te bouwen met de surface area heuristic (SAH) zoals beschreven in de paper van Wald. Mijn code compileert maar daar is helaas alles mee gezegd. De rendertijden zijn geen verbetering t.o.v. de bvh met median split. Waarschijnlijk door een implementatiefout. Rijden met een Ferrari maar altijd voorbijgestoken worden door 2 pk'tjes.

Om de implementaties te kunnen vergelijken zijn 2 statistieken bijghouden in mijn bvh code: het aantal boundingbox/straal intersecties en het aantal driehoek/straal intersecties. Dit heb ik gedaan voor de 3 verschillende scenes. Het doel van een bvh is om het aantal driehoek/straal intersecties te verminderen ten koste van meer boundingbox straal intersecties omdat boundingbox/straal intersecties een pak goedkoper zijn dan driehoek/straal intersecties. Hoeveel "een pak" wil zeggen in mijn code moet ik nog uitzoeken.



Uit deze 2 statistieken heb ik het aantal het boundingbox intersecties per straal(#bbi/ray) en het aantal driehoek intersecties per straal (#tri/ray) berekend. Tussen equal partitioning en median partitioning zijn de verschillen groot, dit valt ook te merken in de snelheidswinst. Het verschil tussen SAH en median partitioning is veel kleiner, het aantal boundingbox intersecties daalt hier sterk maar het aantal driehoek intersecties blijft gelijk. Spijtig genoeg is dat het getal dat de performantie bepaalt (Ook de daling van het aantal boundingbox intersecties heeft een invloed maar minder uitgesproken).

Waarom ik nog niets merk van de snelheidswinst moet ik deze week nog uitzoeken, hopelijk voor mijn presentatie van donderdag :)