ДР12/Т4 - Cosine importance sampling
Cosine importance sampling
В сегашния код на Lambert::spawnRay, изходящите лъчи се генерират абсолютно равномерно в цялата полусфера над точката. Това не е съвсем оптимално, тъй като в същия метод имаме едно умножение на приноса на този лъч с косинуса между лъча и нормалата, в сметката за colorEval (косинусът идва от формулата на Каджия).
Т.е. ние генерираме равномерно разпределени лъчи, но го взимаме с различни тегла; би било добре да правим importance sampling като генерираме лъчи по-нагъсто в посоката, в която теглата са високи, т.е. към посоката на нормалата.
За наша радост съществува метод за генериране на лъчи с косинусово разпределение около даден изходящ вектор. Можете да го видите в Total Compendium. Там всъщност показват как да генерирате лъчи с косинусово разпределение в посока +Y, което вие трябва след това да си завъртите с подходяща ротационна матрица, за да сочи в посока IntersectionInfo::norm.
Направете всичко това като модификация на функцията hemisphereSample().
Трябва да отчетете промяната и във връщания от spawnRay pdf - той става cos(изходящ лъч, нормала)/π.
Резултатът трябва да е идентичен с предходния, но с малко по-малко шум (разликата ще по-видима, ако изключите възможността лъчите да уцелват лампа случайно).
Резултатната картинка трябва да е нещо подобно (40 пътя на пиксел): пример (с игнориране на вторичните лъчи, удрящи лампа), и пример2 (без игнориране).