Ну, вроде поправил.
Суть оказалась в том, что у меня итоговая картинка собирается из пассов (для каждого пикселя):
цвет поверхности, пасс - черно-белая маска прямого освещения, пасс прямого освещения (комбинированные 1-е 2 пасса), пасс ambient occlusion и пасс глобального освещения.
При расчете пасса глобального освещения у меня рекурсивно берутся данные глобального освещения за следующие итерации.
И тут крылся баг: если точка, для которой рассчитывалось освещение являлась источником света - я просто возвращал цвет источника (emission color), а надо было еще назначить в сооветствующие переменные пассов - необходимые цвета, т.к. данные переменных каждого пасса используются в предыдущих итерациях:
this.surfaceColor = intersection.getOwner().getMaterial().getEmission().getEmissionColor();
this.lightSamplingColor = RGBColor.WHITE;
this.ambientOcclusionColor = this.lightSamplingColor;
this.globalIlluminationColor = this.surfaceColor;
return this.surfaceColor;
Вот получившиеся рендеры с одинаковыми настройками:
Теперь бы еще понять - что за дурацкие разводы на сферах, которые имеют место с самых первых версий PathTracer'а.