Простой рендерер изображений, использующий техники трассировки лучей и трассировки путей.
- Сцена 1. Базовая часть(15 баллов):
- Используется модель Фонга локального освещения.
- Реализованы тени и зеркальное отражение.
- Реализованы два примитива: бесконечная плоскость и сфера.
- Реализованы 5 различных материалов: слоновая кость, красная резина, зеркало, стекло и серая поверхность(+1 за преломления).
- Реализована поддержка точечных источников света: в первой сцене используется 3 точечных источника света, во второй 2, в третьей -- 1.
- Реализовано сглаживание посредством суперсемплирования (+1).
- Реализована возможность использования кастомного изображения в качестве фона(параметр -background).
Данное изображение рендерится меньше секунды на процессоре Intel i5-8250U с использованием 8 потоков:

- Сцены 2 и 3.
- Реализован базовый алгоритм трассировки путей (+5).
- В качестве критерия останова используется оценка дисперсии цвета с регулируемым значением ошибки. Кроме того, можно задать минимальное количество трассируемых путей для каждого пиксела.
- Для ускорения рендеринга используется техника генерации теневых лучей.
- Для ламбертовых материалов используется выборка по значимости (+3).
- Реализована исправленная модель Фонга для материалов с глянцевым отражением с использованием выборки по значимости (+3).
- Реализована модель идеального зеркала (+1).
Данная сцена рендерится за минуту 10 секунд на процессоре Intel i5-8250U с использованием 8 потоков:
Следующая сцена также рендерится за минуту 10 секунд на процессоре Intel i5-8250U с использованием 8 потоков:

- Реализована многопоточность с помощью std::thread из STL, максимальное количество потоков можно задавать с помощью аргумента командной строки threads. По умолчанию количество потоков равно количеству ядер процессора. (+2)
- Реализована версия трассирощика путей на OpenGL, использующая для расчёта GPU (+5). В этой версии не реализована модель зеркала, но реализована модель абсолютно чёрного тела (+1). Также
реализована поверхность второго порядка - ограниченный цилиндр (+4). Следующая сцена рендерится около секунды на карте Intel UHD Graphics 620:

Для сборки понадобится компилятор C++ с поддержкой C++17 и CMake. Для сборки нужно выполнить команды:
mkdir build
cmake --build build/ -DCMAKE_BUILD_TYPE=Release
Версия на OpenGL находится в каталоге OpenGL и собирается аналогичным образом. Для неё используются те же аргументы командной строки.
Запуск программы производится следующим образом:
./build/RayTracing -out <путь к выходному изображению> -scene <номер сцены> [-threads <максимальное количество потоков> -background <фоновое изображение>]
Если запустить программу без аргументов, выведется сообщение с форматом командной строки. Аргументы могут передаваться в любом порядке, аргументы out и scene обязательны, аргументы threads и background опциональны.
Для записи изображений в png используется библиотека stb_image_write. Для чтения изображений используется библиотека stb_image. Для инициализации OpenGL используются библиотеки GLFW и GLAD. Для расчётов в OpenGL-версии используется библиотека GLM.