Лекция 10::Задача 0
- Forums:
Сферична лампа
Реализирайте лампа със сферична форма (семпълите трябва да са по повърхността на лампата). За целта направете нов наследник SphereLight на Light и му сложете параметри
pos - позиция на лампата (център на сферата)
radius - радиус на сферата
samples - брой семпли
(регистирайте ги в registerProperties метода).
Регистрирайте новосъздадения клас в DefaultSceneParser::newSceneElement.
В getNthSample(): за samplePos трябва да генерирате случайна точка по повърхността на сферата, а за color параметъра, връщайте просто this->col. Не се заигравайте да правите семплирането stratified - sampleIdx параметъра просто го игнорирайте.
Няма пряк начин да проверите каква е формата на лампата (лампата не е геометрия), но съществува косвен, като лампата "отразим" във Phong шейдър с много голям exponent (2000 или повече). В data/hw10/task0.fmiray имате една сцена, която прави точно това: разположена е една RectLight срещу кубче с такъв шейдър. Ако я изрендерирате, ще видите формата на лампата (леко размазано правоъгълниче), да се "отразява" от стената на кубчето. След като сте готови с реализацията на вашата лампа, разкоментирайте SphereLight блока в task0.fmiray (и закоментирайте RectLight блока). Трябва да ви се получи нещо подобно:
(формата е пръстенче, защото при проекцията на сферата върху равнината, семплите от ръба попадат по-нагъсто).
При правилна реализация трябва да получите точно такова пръстенче, без струпвания на ярки петна по някой от краищата му.
Можете да проверите реализацията си и в boxed.fmiray сцената, като заместите RectLight-а със SphereLight (с подобни параметри).