Прикрутил реализацию полигона (из 3 или 4 вершин, для большего кол-ва вершин надо пилить разбиение полигона на треугольники а я хз как это делать). Он, как и сфера, может быть источником света, по этому пришлось ему фигачить методы получения рандомной точки на поверхности полигона. Частично я это сделал, но частично - еще нет
.
А вот как сделать так, что бы бесконечная плоскость могла бы быть источником света - у меня идей нет.
Представим ситуацию - коробка без верхней плоскости-крышки, в ней лежит шар. Вместо верхней плоскости, коробка накрыта бесконечной плоскостью, которая является источником света. Изнутри коробки, разумеется, мы будем видеть лишь бесконечно малую часть этой бесконечной плоскости.
Далее нам нужно, что бы вот эта бесконечно малая часть освещала все внутренности коробки и объекты испускали мягкие тени.
Вся проблема в тенях.
Для реализации мягких теней нужно взять случайную точку на источнике света, провести луч от точки, для которой рассчитываем освещенность (Целевая Точка) к этой случайной точке на источнике света. Если луч достиг точки на источнике света - Целевая точка полностью освещена. Если нет - целевая точка в тени.
Для получения мягкой тени нужно сделать так ~500-1000 (что бы убрать шум) раз - каждый раз с новой случайной точкой на источнике света.
С конечной плоскостью (полигон) проблем нет - формулы генерирования случайной точки на полигоне описаны.
А вот как сгенерировать случайную точку на бесконечной плоскости я без понятия.
Скорее всего, эти точки нужно генерировать с учетом окружающей геометрии - сделать много трассировок лучей от Целевой Точки в направлении полусферы во все стороны (как иголки у ежа), с шагом, например, в 1 градус. Как только лучи начнут попадать на бесконечную плоскость - запоминать координаты.
Далее на основе полученных координат определить Bounding box - квадратную область на бесконечной плоскости с размерами, равными минимальным и максимальным координатам среди всех сохраненных координат лучей, на которую точно будут попадать лучи из Целевой точки, и затем уже генерировать случайную точку в пределах этой области.