Raytracing 02 - Reflectie en supersampling
Bij de vorige versie van mijn javascript raytracer slaagde ik er maar niet in om daadwerkelijk Anti-aliasing door middel van supersampling (zie referentie) te implementeren. Lang verhaal, maar de clou was dat ergens in dat proces iets ontplofte waardoor de helft van het resultaat alleen maar wit werd.Daarnaast moest ik natuurlijk ook nog een van de meest overtuigende effecten met raytracing implementeren, namelijk reflecties. Deze zijn simpel, doch zeker effectief en geven het eindresultaat een veel realistischer "gevoel" (weinig gebruikt woord in mijn vakgebied) dan zonder.
Reflectie
Het fijne aan raytracing is dat reflecties relatief makkelijk gaan. Het enige dat je hoeft te doen, is de nieuwe lichtstraal berekenen en deze dan weer het algoritme in gooien. De lichtstraal heeft twee eigenschappen, een oorsprong en een richting. De oorsprong is het makkelijkst, dat is namelijk het punt waar je oorspronkelijke lichtstraal het object raakte. De richting is iets lastiger, maar vrij simpel in code;Vector normaal, richting, nieuwerichting;
nieuwerichting = richting - normaal * normaal.dot(richting);
Hierbij is de * operator de scalarvermenigvuldiging van een vector en vector.dot rekent het inwendig product van de twee vectoren. Juist. Nu enkel nog de raytrace functie weer aanroepen en de reflectiekleur is gevonden. Voor een extra beetje realiteit vermenigvuldig ik de reflectiekleur ook nog met de kleur van het object, zodat bijvoorbeeld rode objecten ook een rodere reflectie opleveren.
Supersampling
Supersampling is een eenvoudige techniek, waarbij je simpelweg meervoudig de pixel (een klein beetje opgeschoven) bekijkt, en het gemiddelde van het resultaat neemt. Dit heeft als voordeel dat de kartelige randjes inderdaad weg gaan.Helaas is dit ook heel veel extra rekenwerk. Het is niet efficiënt, en zelfs in het midden van een object (waar toch de meeste stralen zullen vallen). Hiervoor is multisampling bedacht, maar daar ben ik nog niet aan toe. Eerst dit maar.
En verder
Verder zijn er nog een paar fouten gerepareerd, lees vooral het changelog. Ook is er een debugoptie toegevoegd, highlight object. Het object met als ID deze waarde zal paars worden weergegeven. Object IDs zijn altijd >= 0, dus met -1 wordt niets gemarkeerd.