ДР/2011/Л12/5: Cosine importance sampling

Cosine-weighted importance sampling

В кода от лекция 12 има един бъг, който присъства нарочно.
Във формулата на Каджия има множител косинус, на всяка точка от пътя. Т.е., множителя при отражение трябва да е: BRDF(x, w_in, w_out) * dot(x_norm, w_out). Ако разгледате кода на pathtrace(), ще видите, че този косинус присъства само на едното място - в "Direct illumination" случая; в GI случая го няма.

Причината за това е, че за BRDF-и като reflection и refraction умножението по косинуса просто няма да е вярно!
При тях, физиката на "ниско ниво" диктува, че падащ фотон на чисто огледало се отразява без никаква модификация; там нямаме дифузна повърхност, върху която да се "разстели" падащия косо лъч и да обуславя по-слабото осветление.
Това накратко значи, че сегашните ни реализации на Reflection и Refraction са вярни.
В Lambert и Phong BRDF-ите въведете следните промени: връщания цвят от spawnRay() функцията трябва да се умножава по 2*cos(изходящ лъч, нормала) (двойката е за да се запази общата мощност както досега - иначе картинката ще стане доста по-тъмна). pdf-а си остава 1/pi.

След направените промени, сцената smallpt.retrace ще си остане почти същата; разликата се усеща основно на тавана, който става забележимо по-светъл.
Е, сега ще искаме и да направим importance sampling, след като вече имаме тегло, можем да генерираме лъчите по-начесто там, където теглото е по-високо. Т.е., искаме модификация на функцията hemisphereSample(), която генерира лъчи по-нагъсто в "полюса" на полусферата. Формално, искаме вероятността да се падне случаен лъч p да е пропорционална на косинуса между p и нормалата.
Как да се генерират такива "отместени" разпределения потърсете в интернет.
Трябва да отчетете промяната и във връщания pdf - той става 2*cos(изходящ лъч, нормала)/pi.
Резултатът трябва да е идентичен с предходния, но малко по-безшумен (разликата ще по-видима, ако изключите възможността лъчите да уцелват лампа случайно).
Резултатната картинка трябва да е нещо подобно (40 пътя на пиксел): пример (с игнориране на вторичните лъчи, удрящи лампа), и пример2 (без игнориране).