Кто там кодит? - Attribute bump mapping: bump mapping для тех кто не въехал.

Miracle #03
    (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!