ДР/2015/12/5
- Forums:
Cosine importance sampling
В сегашния код на Lambert::spawnRay, изходящите лъчи се генерират абсолютно равномерно в цялата полусфера над точката. Това не е съвсем оптимално, тъй като в същия метод имаме едно умножение на приноса на този лъч с косинуса между лъча и нормалата, в сметката за colorEval (косинусът идва от формулата на Каджия).
Т.е. ние генерираме равномерно разпределени лъчи, но го взимаме с различни тегла; би било добре да правим importance sampling като генерираме лъчи по-нагъсто в посоката, в която теглата са високи, т.е. към посоката на нормалата.
За наша радост съществува метод за генериране на лъчи с косинусово разпределение около даден изходящ вектор. Можете да го видите в Total Compendium. Там всъщност показват как да генерирате лъчи с косинусово разпределение в посока +Y, което вие трябва след това да си завъртите с подходяща ротационна матрица, за да сочи в посока data.normal.
Направете всичко това като модификация на функцията hemisphereSample().
Трябва да отчетете промяната и във връщания от spawnRay pdf - той става cos(изходящ лъч, нормала)/π.
Резултатът трябва да е идентичен с предходния, но с малко по-малко шум (разликата ще по-видима, ако изключите възможността лъчите да уцелват лампа случайно).
Резултатната картинка трябва да е нещо подобно (40 пътя на пиксел): пример (с игнориране на вторичните лъчи, удрящи лампа), и пример2 (без игнориране).
Comments
Като гледам формулата (36),
Като гледам формулата (36), защо да генерира лъчите с посока +У ? и другия въпрос е, параметъра n който е във формулата, също ли трябва да е random или ние да избираме число ?
Пояснение
Формулата 36 е за cos^n разпределение, а в случая трябва само cos-разпределение, т.е. при n=1, и можете да видите формула 35.
Относно посоката - въпрос на нотация; просто в нашия рейтрейсър +Y беше "нагоре", докато в Total Compendium е +Z. Но процедурата е същата - генерирате "канонични" лъчи в някаква посока и след което ги ротирате, за да са в посока към normal.