Raytracing 01 - De basisstappen
Zo, er kwam tijdelijk iets te veel voorbij om een zinnig stuk te schrijven, maar dan nu toch echt. Raytracing. Had ik beloofd.Wat is Ray Tracing?
Ray tracing is een algoritme om een weergave van een drie dimensionale omgeving te creëren op een tweedimensionaal vlak. In monkey terms, om afbeeldingen te renderen. Ray tracing heeft als voordelen dat vrij veel visuele effecten zoals schaduwen en reflecties eenvoudig te implementeren zijn en dat het algoritme ook vrij logisch is. Het grote nadeel is dat het ongelofelijk veel zinloos rekenwerk is, duizenden keren zo veel als noodzakelijk voor wireframe-rendering.Het algoritme is simpel. Men heeft namelijk een camerapunt en een "denkbeeldig" scherm. Vervolgens stel je voor iedere pixel van dat scherm een "lichtstraal" op, die door die pixel gaat vanuit het camerapunt. Dan is het een kwestie van het eerste object vinden waar die straal op botst. Dit is tijdrovend en daarmee ook het grootste punt van vertraging. Tot zover de theorie, nu het programma.
Licht en schaduw
Om mee te beginnen wilde ik net als dit artikel op Flipcode, dat geholpen heeft bij het schrijven van mijn profielwerkstuk, beginnen met simpele diffusie en schaduw.Schaduw kan je berekenen door vanaf het punt in de ruimte dat je gevonden hebt te kijken of er een vrij pad bestaat tussen dat punt en de lichtbron(nen). Dit is eigenlijk hetzelfde als een gewone intersectietest, dus niet heel bijzonder.
Diffusie is daarentegen een stuk moeilijker correct te simuleren. Eigenlijk zou je miljarden fotonen moeten afvuren en kijken waar ze een beetje terechtkomen. Helaas, dit is veel werk, en dus doen we een benadering. Deze gaat als volgt:
for(iedere lichtbron) {
if(!in_schaduw()) {
lichtsterkte += lichtsterkte_bron * (oppervlaktenormaal * lichtinvalshoek) / afstand_lichtbron^2;
}
}Zoals te zien is deze verre van correct, maar het ziet er verder redelijk uit en daar gaat het om.. Zie onder.