ДР/2011/Л12/3: Light importance sampling
- Forums:
Light importance sampling
Досега, в pathtrace(), когато избирахме да вържем края на текущия път с лампа, избирахме лампата случайно, с еднаква вероятност.
Т.е., вероятността да уцелим коя да е лампа беше 1/scene.lights.size(). Това не е най-добрият начин, особено ако в сцената има много лампи. Общата идея на всички евристики в случая е, че ако дадена лампа е далеч и/или слаба (слабо допринася за цвета в дадена точка), то вероятността да я изберем трябва да е по-ниска.
Добавете флаг lightsImportanceSampling към GlobalSettings. Ако е включен, прилагайте "умна" схема за избиране на лампа в pathtrace(). Имате свобода да изберете детайли как да реализирате самата схема. Ето няколко идеи: можете да обходите всички светлини, и, за всяка, да сметнете разстоянието между светлината и шейдваната точка (x) на квадрат. Реципрочното от това разстояние е пропорционално на вероятността. Една по-добра идея е да вземете в предвид и яркостта на самата лампа, и да я включите в сметката. Числата, които ще сметнете така, не са истински вероятности - например, за сцена с три лампи, ако за дадена точка сме получили {0.1, 0.2, 0.25}, то трябва да организираме някакъв случаен процес, който избира втората лампа около два пъти по-често от първата, а третата избира с около 25% по-често от втората. В pdfLight трябва да запишете действителната (нормирана) вероятност, която сте имали при избирането на лампата, която накрая се е паднала (т.к. вече не е 1/N).
Добавил съм специална сцена - data/hw12/lights.retrace - която представлява пример, за който равномерното избиране се държи лошо. Имаме Г-образен коридор, като всеки сегмент от коридора е осветен от 4 правоъгълни лампи. Имаме също и "прозорец" със "слънце". Сцената в SVN се ренди с 27 пътя на пиксел, което дава много шумно изображение (трудно се различават дори ръбовете на стените). След подобренията се очаква ренденето да не се забави с повече от 30%, а в същото време шумът да намалее значително. Решението ви трбява да запазва особеностите на сцената (да не "изчезват" лампи, да си го има ярката "слънчева" част, но пък и да не остава само тя и т.н.). Тук можете да вземете в предвид и особености на сцената, и да добавяте хитрини (например, да изключвате светлините от "грешната част" на Г-то, ако е сигурно, че те няма как да осветяват; светлинни портали за слънцето и т.н.).
Ето и примерен рендер с 256 пътя/пиксел след подобренията.