(c) Crite/Triumph
(i) Blade/Triumph
------------------
Как то раз скучая, я решил написать
эффект освещения объемной поверхности,
умнее говоря bump mapping. Конечно мно-
жество таких эффектов вы видели в разных
демах, но мой эффект более прост и
укладывается во фрэйм, точнее около
40000 тактов.
Я долго думал каким методом отобра-
жать свет на экране и грипп мне подска-
зал, в итоге получился атрибутный вари-
ант ;) Сразу же оговорюсь, что все ниже
изложенное ничто иное, как просто алго-
ритм bump mapping'а и предназначен для
развития идеи начинающим кодерам.
Итак мой метод заключается
в том, что вы задаете объ-
ект в виде набора пласти-
нок с разным углом накло-
на. Вот номера пластинок,
принятые в моем исходнике:
4,3,2,1 - изменяют яркость
света;
5,0 - не изменяют.
Теперь о том как я определяю яркость
наклонной пластинки. Для этого мне нужно
задать координаты центра и текущего
кусочка пучка света. По идее это делает-
ся следующим образом: запоминаем коорди-
наты левого верхнего угла пучка, связан-
ные с левым верхним углом экрана, затем
прибавляем числа для определения центра
этого пучка и сравниваем полученные
значения с координатами текущего кусоч-
ка.
Все это пожирает очень много времени
и я поступил другим способом: связываю
систему координат с левым верхним углом,
но не экрана, а пучка света. Координаты
центра относительно этой системы коорди-
нат - константа, т.е. не изменяющееся
число. Константу сравниваем с текущей
координатой, и в зависимости от типа
текущей площадки, вызываем разные проце-
дуры (о них немного ниже). Координату
левого верхнего угла пучка света относи-
тельно левого верхнего угла экрана я
использую всего один раз за один шаг
эффекта, для вычисления начального адре-
са в атрибутах.
Процедуры вычисления яркости рабо-
тают так: возьмем к примеру пластинку 1,
если она расположена левее чем центр
источника, то назовем это положение #1,
а если правее (т.е. ее освещает под
углом более близким к 90 градусов, чем в
положении #1), то назовем соответственно
положение #2.
В таблице Light задан вид пучка
света, где числа это цвет и радиус
кольца одной яркости. Яркость я не стал
вычислять сложными методами, а задал две
таблицы TABL1 и TABL2 (для #1 и #2
положения). Формат таблицы: 1 - для
0-ой, 2 - для 1-ой и так далее до 8
яркости.
Координаты задаются в отдельном фай-
ле. Сначала идет координата x, потом y.
Но вы должны учитывать то, что пучок
света не должен вылетать за края экрана.
Я не стал делать на это проверку, потому
что она занимает много времени. Кстати
координаты вы сможете задавать програм-
мой COORD (находится в приложении), она
задает 100 координат фигуры лиссажу.
Для того чтобы узнать скорость прог-
раммы - удалите точку с запятой в стро-
ках со знаком "@". Исходник вы найдете
также в приложении, называется он "LIG-
HT.H" (естественно в формате рулезного
ассемблера ALASM).
That's all folx!