ДР 2013/Л6/Група0

В лекция 6 споменахме, че ако създадем топче с IOR=1, то става невидимо, но пък има видима сянка. Докато този дефект е по-скоро теоретичен, можем да измислим съвсем реални ситуации, в които може да искаме един обект да не хвърля сянака, или сянката да е само частична - например, ако искаме да си направим прозорец.

Вижте следната сцена: цък. В нея има едно кубче, чиито стени са прозрачни - имат по един плосък стъклен панел, обковани в "метални" профили. Ако я изрендите, ще видите едни сериозно дефектни сенки в сянката на кубчето (и не само). А ще искаме да се получи нещо такова. Как ще направим това?

Модифицирайте testVisibility(), така че да връща float число от 0 до 1 (1 = двете точки се виждат напълно; 0 - пълно засенчване). Добавете метод getTransparency() на Shader, който да връща колко прозрачен е обекта (нека връща число близко до 1 за Refr, а за останалите - 0).
В testVisibility направете трасиране на всички пресечни точки по пътя, по подобие на CsgOp::findAllIntersections. Методът ще трябва да изнамери
transparency-тата на всички Shader-и по пътя, и да ги умножи - това е крайната прозрачност за пътя между двете точки. Полученото число ползвайте като множител на diffuse и specular компонентите в Lambert и Phong.

Задачата носи 5 т. ако реализирате Layered::getTransparency() просто (без да прави смесване на отделните слоеве). Получавате още една бонус точка ако реализирате правилно смесване за Layered шейдъра (само тогава ще получите точно примерната картинка - в сцената, всички стъкла са Layered с Fresnel).

Comments

Бъгове

Почнах да я правя задачата, но то стана по-лошо отколкото беше :D - цък

Сякаш сянките станаха по-тъмни, а също се появи някакъв бъг при футболната топка. Може да видите, че до голямата огледална сфера има сянка, хвърляна от невидима топка :) .

Смесването на слоевете още не съм го оправил, но ако му сложа на getTransparency() да връща 1, се получава следното нещо - цък

Не съм сигурен откъде идват тези бъгове (то и сянката на невидимата топка не трябваше да я има - поне не толкова тъмна), дали от неправилна реализация на testVisibility(), дали от шейдърите ... Някакви идеи или да пращам код ?

Е за невидимата топка,

Е за невидимата топка, най-вероятната причина ще е бъг в testVisibility, но най-добре прати код.

Грешка в примера?

Имам въпрос по картинката дадена в примера. Там една част от равнината е в сянката на ръб от куба, въпреки че напрактика тази област от равнината е преди ръба. Ето как изглежда рендерираното изображение при мен - http://postimg.org/image/i4hrsb0jr/ Ето и я и оригиналната картинката, посочил съм сянката и ръба, който я предизвиква. http://postimg.org/image/qd7k1fi8n/

notabug

Аз не виждам проблем в примерното изображение - там ръбът си е точно там, където трябва да бъде. По-скоро в твоя рендер, част от този ръб мистериозно изчезва - можеш да провериш защо става това, тъй като очевидно става дума за някаква грешка. Забележи, че идентичният ръб отдясно (заден-десен ръб) си има пълната дължина, както в примера, така и в твоя рендер.