Нужно учесть искажения объектов перспективой по краям. Пиксели на поверхности полукуба домножаются на косинус угла между направлением камеры и отрезком, соединяющим центр проекции с пикселем. Также нужно учесть закон косинуса: освещенность поверхности пропорциональна косинусу угла между нормали к поверхности и направлением на источник света.
Поскольку рассчитывать эти величины каждый раз для каждого патча слишком дорого, то разумней подготовить специальную карту, на которую мы будем домножать наш полукуб — multiplier map. Это и делает утилита Rad. При ее запуске параметром задается, сколько проходов (число отражений света) мы рассчитываем. Пересчет карты 2 (квартира) в восемь проходов на Riva TNT Vanta занимал примерно 6–8 часов. Но оно того стоило.
Ко второй версии я добавил зеркала и полупрозрачные поверхности.
Текстура — растровое изображение, накладываемое на поверхность полигональной модели для придания ей цвета, окраски или иллюзии рельефа.
Копланарные многоугольники — многоугольники, лежащие в одной плоскости.
Работа - Адамант
На третьем курсе университета я совсем забросил учебу и целый день сидел за компьютером, занимаясь то поисковиком, то 3D-движком. Я пытался собрать единомышленников на форуме GameDev.ru для написания своей собственной игры. У меня была надежда, что ее кто-нибудь заметит и даст начальные инвестиции на более серьезную разработку.
Я переехал из соседнего блока к одногрупнику Вале, через которого я выходил в общажную сеть. Мы полгода жили в трешке вдвоем до новогодней сессии.
На этом же курсе было разделение по кафедрам. Я выбрал кафедру ядерной физики. Перед новым годом я подарил пятизвездочный коньяк «Арарат» заведующему кафедрой. Коньяк не был дорогой, но этот жест очень понравился заведующему. Он сказал, что, в случае каких-либо проблем, я могу обращаться к нему лично.
В конце первого семестра я твердо решил, что пора бы найти работу. Где я мог заработать? Например, разгружая что-то. Я нашел заманчивое предложение в газете о разгрузке мешков с мукой. Физическая форма у меня была хорошая. Я поехал по объявлению в Питер. Там мужики мне объяснили, что в среднем за день нужно разгрузить несколько тонн муки. Если я согласен — меня ждут завтра к 8 утра. Хорошо, что ж, попробую.
На следующий день уже в 6 утра я был на железнодорожной станции. Только вот электричка не доехала до станции «Университет» — сломалась и парализовала все движение. «Значит, не судьба. Видимо, эта работа не для меня», — с икренним облегчением подумал я. И пошел просматривать предложения о работе программистом на популярном тогда сайте job.ru.
Резюме у меня было скромное: студент, знания С/С++, WinAPI, OpenGL, опыта работы нет, для себя программирую такой-то 3D-движок.
Мне ответило несколько компаний. Одна из них — «Адамант Мультимедиа». Это была компания, занимающаяся разработкой 3D Action игр и принадлежащая крупному строительному холдингу «Адамант». Офис «Мультимедиа» располагался практически в центре Питера на Сенной площади. Туда я и поехал на собеседование. Меня встретил технический директор Дамир и провел в «большую программерскую» на четвертом этаже. По периметру кабинета стояло семь столов. На каждом столе по два монитора, под столом — один-два блока компьютеров. Кто-то усердно смотрел в мониторы, кто-то что-то обсуждал.
Дамир предложил мне сесть за стол в центре комнаты и дал листок бумаги. На этом листе было несколько заданий, которые он попросил меня решить. Я никогда не понимал программирования на бумаге. Еще в 11-м классе мы ездили на вступительную олимпиаду по программированию на факультет прикладной математики (ПМПУ). В огромной аудитории собралось около сотни студентов, которым также предложили написать код на бумаге. Организаторы олимпиады подразумевали, что вы должны помнить всю стандартную библиотеку C/C++ (я писал тогда на C++) наизусть. Реально ведь бред. Тогда я не прошел.
Дальше, с моего разрешения, Дамир попросил прислать код моего 3D-движка, чтобы главный программный архитектор компании мог оценить мои профессиональные навыки:
— Зачем вы написали отдельный редактор уровней? Ведь есть тот же 3D Studio Max?
— Просто потому что было интересно.
Но в итоге меня туда не взяли, потому что я все еще учился.
— Учеба будет отнимать много времени, — сказал Дамир и закончил собеседование.
Вторая компания, куда я поехал, располагалась в квартире старого дома. Писали они тоже какие-то игры. У них даже были обеды в виде яичницы от специально приходящей бабушки. Зарплату предлагали совсем копеечную, по меркам Питера, — всего $200.
Третья компания находилась при каком-то институте и занималась автоматизацией железок, типа лазеров и тому подобного. Выслушав меня, мне пафосно отказали: «Слабоват ты, сынок, для нас. Гуляй отсюда».
Куда я ездил еще, уже и не помню.