ДР12/Т1 - Layered BRDF
Layered BRDF
Реализирайте BRDF, отговарящ на досегашния слоест шейдър. Моделирайте шейдъра чрез Монте-Карло семплиране - процедурата eval() трябва да избере само един, случаен слой, от всички, и да викне неговия eval() метод. Аналогично за spawnRay(). Самото избиране на слоевете направете с importance sampling. Приемете, че прозрачностите на слоевете няма да са цветни, а само тонове на сивото. Като пример:
най-долен слой: плътност 1.0 (100%)
среден слой: плътност 0.3
най-горен слой: плътност 0.1
Тук трябва да организирате случаен процес, който:
- в 10% от случаите избира най-горния слой и ползва неговите eval()/spawnRay();
- в 30% от останалите 90% (тоест, 27%) избира средния слой;
- в останалите случаи избира най-долния слой.
За да тествате реализацията си, в smallpt.hexray заменете шейдъра на glassSphere: от "refr" на "glass". Резултатът ще е нещо подобно (при numPaths = 256).