Адаптивен рей-трейсинг
Променете renderWithMonteCarlo(), renderWithoutMonteCarlo() и raytrace() функциите така, че да реализират адаптивен рейтрейсинг (както е описано в лекция 14).
Можете да разчитате, че dof, gi и stereoscopic ефектите ще са изключени.
Променете raytrace така, че вместо да връща единичен цвят, да връща фрагмент - това е структурка, която описва пълната информация за пресечната точка за даден изстрелян лъч - цвят (както досега), дълбочина до пресичането, индекс на пресечения Node, евентуално индекс на пресечения триъгълник, uv координати на пресечната точка...
Разделете екрана, който рендим на квадратчета 8х8. За всяко 8х8 квадратче, пуснете само 4 лъча в краищата и анализирайте четирите фрагмента. Направете функция closeEnough(), която, по дадени 4 фрагмента, решава дали да разделя рекурсивно квадратчето или не (това е сърцето на задачата). Ако се реши да не се разделя рекурсивно, останалите N*N-4 пиксела от квадратчето запълнете, като интерполирате между четирите фрагмента (в най-грубия вариант: интерполирайте по цветовете; за текстурираните участъци, далеч по-добър резултат може да получите като интерполирате по текстурните координати и взимате цветовете от самата текстура).
За успешно ще се счита решение, което наподобява достатъчно много неадаптивен рендер, а в същото време сваля времето за рендене с над 20% (на типична сцена, напр. meshes.hexray).