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.

Huidige versie van de scene, 4x4 anti-aliasing en een hoge tracediepte.

Verder in deze serie

Raytracing 01 - de basisstappen
Bert Peters | 10:02:16 18/01/2012 | Link | 0 reactie(s) | Tags: Serie ray tracing 
tweet


Reacties


Laat zelf een bericht achter

Naam (verplicht)
E-mail (verplicht, nooit publiek)
Typ deze tekst over: captcha
Link
Opmerking