ДР/2015/12/3

Light importance sampling

Досега, в pathtrace(), когато избирахме да вържем края на текущия път с лампа, избирахме лампата случайно, с еднаква вероятност.
Т.е., вероятността да уцелим коя да е лампа беше 1/scene.lights.size(). Това не е най-добрият начин, особено ако в сцената има много лампи. Общата идея на всички евристики в случая е, че ако дадена лампа е далеч и/или слаба (слабо допринася за цвета в дадена точка), то вероятността да я изберем трябва да е по-ниска.

Добавете флаг lightsImportanceSampling към GlobalSettings. Ако е включен, прилагайте "умна" схема за избиране на лампа в pathtrace(). Имате свобода да изберете детайли как да реализирате самата схема. Ето няколко идеи: можете да обходите всички светлини, и, за всяка, да сметнете разстоянието между светлината и шейдваната точка (x) на квадрат. Реципрочното от това разстояние е пропорционално на вероятността. Една по-добра идея е да вземете в предвид и яркостта на самата лампа, и да я включите в сметката. Числата, които ще сметнете така, не са истински вероятности - например, за сцена с три лампи, ако за дадена точка сме получили {0.1, 0.2, 0.25}, то трябва да организираме някакъв случаен процес, който избира втората лампа около два пъти по-често от първата, а третата избира с около 25% по-често от втората. В pdfLight трябва да запишете действителната (нормирана) вероятност, която сте имали при избирането на лампата, която накрая се е паднала (т.к. вече не е 1/N).

Тествайте върху примерната сцена - data/hw12/sphtri.qdmg - която представлява пример, за който равномерното избиране се държи лошо (при 128 пътища на пиксел има забележим шум). Същевременно трите лампи имат ясно изразени "области на влияние" и би било добре да правим importance sampling. Направете си функция getCenter() на Light - която да ви връща "центъра" на лампата, за да имате какво да използвате в евристиката при оценяването на приноса на дадена лампа. Промените по избора на лампата направете в блока на pathtrace(), който изчислява resultDirect. При добра реализация, би следвало шумът драстично да намалее - приблизително ще отговаря на резултата без importance sampling, но при 400 пътища на пиксел.