ДР 2013/Л6/Група0
- Forums:
В лекция 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
Аз не виждам проблем в примерното изображение - там ръбът си е точно там, където трябва да бъде. По-скоро в твоя рендер, част от този ръб мистериозно изчезва - можеш да провериш защо става това, тъй като очевидно става дума за някаква грешка. Забележи, че идентичният ръб отдясно (заден-десен ръб) си има пълната дължина, както в примера, така и в твоя рендер.