Мъгла
Да се добави възможност да се симулира "мъгла" в сцената.
Базова задача (10т)
Да се добавят следните параметри към GlobalSettings:
fog - (bool) - дали мъглата да е включена или не
fogColor - (Color) - цвета на мъглата (да е 50% сиво, ако не е зададен в сцената)
fogHalfDist - (double) - определя плътността на мъглата. Показва разстоянието, за което видимостта пада наполовина.
Мъглата реализирайте в raytrace() функцията. В нея разгледайте какво е разстоянието от началото на лъча до първата ударена геометрия (minDist) и чрез него определете колко да модулирате цвета, връщан от шейдъра. Определянето на този коефициент става чрез експоненциално затихване - видимостта пада наполовина за всеки fogHalfDist единици разстояние по дължината на лъча. Например, ако fogHalfDist е 100, a minDist e 300, значи три пъти коефициентът е намалял наполовина, т.е. 50%^3 = 12.5%. Следователно, raytrace() трябва да върне цвят, като вземе 12.5% от резултата от шейдъра, и 87.5% от цвета на мъглата (fogColor). Разбира се, трябва да реализирате гладко изчисление на този коефициент в зависимост от minDist разстоянието, чрез експоненциално затихване.
Примери:
1. meshes.hexray, fogColor не е зададен изрично, fogHalfDist = 50: screenshot
2. boxed.hexray, fogColor = (0.3, 0.3, 0.7), fogHalfDist = 25: screenshot
Бонус (+5т):
Мъглата да има две ивици - горна и долна - като границата между тях е зададена с височина - fogEdge (т.е. всички точки с y > fogEdge са в горната ивица, a останалите - в долната). За двете ивици да могат да се задават различни плътности (т.е. fogHalfDist да се отнася за горната ивица, а друг параметър - fogHalfDist2 да се отнася за долната). fogEdge също да може да се задава от сценовия файл. При пресмятането на коефициента на затихване, да се разгледа в коя ивица се простира лъча - ако минава и през двете, да се комбинират резултатите по подходящ начин (т.е. да се вземат под внимание затихванията на частите на лъча от всяка ивица и да се умножат).
Пример:
3. boxed.hexray, fogHalfDist = 60 (горна ивица), fogHalfDist2 = 6 (долна ивица), fogEdge = 9: screenshot