Ik zit hier met een ray tracer die geschreven is door een paar collega's in MATLAB en de vraag of deze sneller kan. Sowieso gaat er een deel in C++ geschreven worden waarbij er qua implementatie al een en ander geoptimaliseerd kan worden, maar ik zit nu ook naar het algoritme zelf te kijken om erachter te komen of daar wat te halen valt.
Normaalgesproken wordt hij gebruikt om te kijken hoe licht door een object heen loopt. Het object wordt uit een STL bestand geladen en omgezet in een mesh van driehoekjes. Vervolgens wordt er vanuit een bron een ray naar het object geschoten en resulteert dit in een transmissie en een reflectie onder een bepaalde hoek afhankelijk van de materiaaleigenschappen die toegekend zijn aan het driehoekje wat als eerste geraakt wordt. Die transmissie en reflectie vormen weer nieuwe rays die allemaal vanuit het midden van het geraakte driehoekje gepropageerd worden tot ze het object uitvliegen of een bepaalde hoeveelheid interacties hebben bereikt.
Het lijkt erop dat een groot deel van de processortijd zit in het bepalen of een ray een driehoekje raakt of niet. In eerste instantie werden alle driehoekjes getest op een intersect met de ray, maar ergens heeft iemand bedacht om alle driehoekjes in cellen te verdelen en eerst te testen of een ray een bepaalde cel raakt (om vervolgens alleen de driehoekjes in die cel te testen). Daarna heeft weer iemand anders bedacht om cellen van cellen te maken om hier nog meer uit te slepen.
Dit opdelen van de mesh in een datastructuur die visible-surface determination makkelijker maakt kan misschien nog wel verder verbeterd worden. Ik heb geen achtergrond in 3D rendering of gaming engines, maar de techniek die nu gebruikt wordt heeft wat weg van octrees. Dit zette me aan het denken, ik had iets gelezen over hoe Doom binary space partitioning gebruikt om levels efficient te kunnen renderen en hoe je met zo'n BSP tree een statisch model onafhankelijk van gekozen cameraperspectief back to front kan renderen. Wij gebruiken een statisch model, ray tracen is soort van steeds vanuit een ander perspectief ergens naar kijken en visible-surface determination is soort van het dichtsbijzijnde vlakje (recht voor de camera) vinden. Zou het niet mogelijk zijn om van ons model een BSP tree te maken (dat eenmalig wat meer rekenkracht kost) om vervolgens tijdens het ray tracen het eerste vlakje dat potentieel geraakt wordt te vinden door deze BSP tree te doorlopen?
Alleen houdt mijn voorstellingsvermogen hier wel een beetje op. Vind het sowieso al redelijk magisch hoe je na het maken van een BSP tree kennelijk vanuit een willekeurig perspectief back to front kan renderen, dus vind het lastig om te beredeneren of je daarmee ook het eerste driehoekje wat mijn ray zou moeten raken op die manier kan vinden, iets zegt me dat het dichtstbijzijnde driehoekje (dat dus als laatste gerendert wordt in back to front) niet per se recht voor de camera hoeft te zitten (en in dat geval dus niet geraakt wordt door een ray die je precies door het midden schiet). Bovendien weet ik daarmee ook nog niet of het potentieel sneller gaat zijn.
Zijn er hier toevallig mensen die meteen al iets kunnen roepen in de trant van: "dat gaat nooit werken omdat" of "dat wordt al gedaan en hier kun je vinden hoe"? Of het anderzijds leuk / interessant vinden om hierover te filosoferen?
Oh PS: in de toekomst willen we misschien GPUs gaan gebruiken hiervoor (we hebben een manier om de bijdragen van alle individele rays naderhand op te tellen, dus parallelizatie zou ook voor een flinke snelheidswinst kunnen zorgen). Hebben moderne videokaarten tegenwoordig ingebouwde instructies om bijvoorbeeld makkelijk te ray tracen / visibility determination te doen / intersections met driehoekjes te bepalen e.d.?
Normaalgesproken wordt hij gebruikt om te kijken hoe licht door een object heen loopt. Het object wordt uit een STL bestand geladen en omgezet in een mesh van driehoekjes. Vervolgens wordt er vanuit een bron een ray naar het object geschoten en resulteert dit in een transmissie en een reflectie onder een bepaalde hoek afhankelijk van de materiaaleigenschappen die toegekend zijn aan het driehoekje wat als eerste geraakt wordt. Die transmissie en reflectie vormen weer nieuwe rays die allemaal vanuit het midden van het geraakte driehoekje gepropageerd worden tot ze het object uitvliegen of een bepaalde hoeveelheid interacties hebben bereikt.
Het lijkt erop dat een groot deel van de processortijd zit in het bepalen of een ray een driehoekje raakt of niet. In eerste instantie werden alle driehoekjes getest op een intersect met de ray, maar ergens heeft iemand bedacht om alle driehoekjes in cellen te verdelen en eerst te testen of een ray een bepaalde cel raakt (om vervolgens alleen de driehoekjes in die cel te testen). Daarna heeft weer iemand anders bedacht om cellen van cellen te maken om hier nog meer uit te slepen.
Dit opdelen van de mesh in een datastructuur die visible-surface determination makkelijker maakt kan misschien nog wel verder verbeterd worden. Ik heb geen achtergrond in 3D rendering of gaming engines, maar de techniek die nu gebruikt wordt heeft wat weg van octrees. Dit zette me aan het denken, ik had iets gelezen over hoe Doom binary space partitioning gebruikt om levels efficient te kunnen renderen en hoe je met zo'n BSP tree een statisch model onafhankelijk van gekozen cameraperspectief back to front kan renderen. Wij gebruiken een statisch model, ray tracen is soort van steeds vanuit een ander perspectief ergens naar kijken en visible-surface determination is soort van het dichtsbijzijnde vlakje (recht voor de camera) vinden. Zou het niet mogelijk zijn om van ons model een BSP tree te maken (dat eenmalig wat meer rekenkracht kost) om vervolgens tijdens het ray tracen het eerste vlakje dat potentieel geraakt wordt te vinden door deze BSP tree te doorlopen?
Alleen houdt mijn voorstellingsvermogen hier wel een beetje op. Vind het sowieso al redelijk magisch hoe je na het maken van een BSP tree kennelijk vanuit een willekeurig perspectief back to front kan renderen, dus vind het lastig om te beredeneren of je daarmee ook het eerste driehoekje wat mijn ray zou moeten raken op die manier kan vinden, iets zegt me dat het dichtstbijzijnde driehoekje (dat dus als laatste gerendert wordt in back to front) niet per se recht voor de camera hoeft te zitten (en in dat geval dus niet geraakt wordt door een ray die je precies door het midden schiet). Bovendien weet ik daarmee ook nog niet of het potentieel sneller gaat zijn.
Zijn er hier toevallig mensen die meteen al iets kunnen roepen in de trant van: "dat gaat nooit werken omdat" of "dat wordt al gedaan en hier kun je vinden hoe"? Of het anderzijds leuk / interessant vinden om hierover te filosoferen?
Oh PS: in de toekomst willen we misschien GPUs gaan gebruiken hiervoor (we hebben een manier om de bijdragen van alle individele rays naderhand op te tellen, dus parallelizatie zou ook voor een flinke snelheidswinst kunnen zorgen). Hebben moderne videokaarten tegenwoordig ingebouwde instructies om bijvoorbeeld makkelijk te ray tracen / visibility determination te doen / intersections met driehoekjes te bepalen e.d.?
HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m