Scenergy
#02
31 декабря 1999 |
|
Coding - Texture mapping + Phong shading реализация от Senat/Eternity Industry.
Warning!!! Убедительно прошу редакторов журнала Scenergy оставить статью без изменений. Вся ответственность за сказанное беру на себя я (Senat/Eternity Industry) @- Texture mapping + Phong shading (C) Eternity Industry В этой статье я попытаюсь обьяснить как реализовать этот тормозной эффект на ZX. Eго вы можете увидеть в нашей демухе "Napalm" (та часть, где мотается полусфера, на ней натянута текстура глаза и по поверхности бегает световой блик), на Amiga этот эффект давно уже реализован в демо Ramses'a, Mellow Chips, Floppy, Еxploder'om, и др.. Сразу предупрежу, что данная статья предназначена для кодера выше среднего уровня, поэтому всяким там SerzhSoft'am и т.д. читать это просто запрещается !!! ;) Если вы поняли как сделать texture map и environment,то закодить ЭТО не составит особого труда, обьяснять заново T_MAP просто лень. Кстати, таким же способом можно реализовать и T_MAP, заливка ускорится примерно процентов на 30. Уважаемые кодеры ! если вы сразу захотите закодить это, советую не спешить, сделайте для начала хотя бы Gouraud или Т_MAP! Начну с основного цикла : POP HL ; Снимаем со стека смещемие по текстуре ; (в H - шаг по Y, в L - шаг по X ). ADD HL,BC ; Прибавляем его к координатам боковой ; линии полигона (по текстуре), заранее ; вычисленной и вытащенной из таблицы ; в начале рисования сканлинии LD A,(HL) ; Берем цвет из текстуры. EXX ; POP HL ; Снимаем со стека смещение по текстуре ; (световое пятно) ADD HL,BC ; Прибавляем его к координатам боковой ; линии полигона (по текстуре светового ; пятна) ADD A,(HL) ; складываем с цветом пятна LD E,A ; т.к. при сложении возникают цвета больше ; #10, то цвет должен быть максимальным, ; т.е. #0F. Т.к на ZX нет команды, которая ; при сложении делала это, то проходится ; заниматься извращением и делать таблицы ; сложенных цветов. LD A,(DE) ; Берем результирующий цвет. EXX ; LD (DE),A ; пихаем его в буфер для вывода. INC E ; Вот и усе!!! Теперь по расположению текстур в памяти. Они должны располагаться в одной из страниц (например в #11), причем в 1-ой странице максимум влезает 4 текстуры (64 x 64) первые #40 байта - первая текстура, вторые #40 байта - вторая, третьи #40 байта третья ... и т.д., и через #0100 то же самое. Например: Общий размер по Х = #0100 | | | | | | Tекстура | Текстура | Текстура | Текстура | | светогого | для Tmap | для заднего | для чего- | | пятна | | фона | нить еще | | | | | | | | | | | Буфер для вывода должен иметь размеры 38 x 256 т.к. я считаю, что размер по Y = 38 является оптимальным, т.к. при стандартном C2P экран успевает обновиться за 2 фрейма. Размер по X = 256 сделан для того чтобы отпала необходимость клипирования полигона по Х. Буфер для вывода, естественно , должен располагаться до #C000 т.е. начиная с #9A00. Все precalc'и в начале основного цикла точно такие же, как и в обычном T_MAP'е, с той разницей, что вычислений нужно выполнять в 2 раза больше, чем в Т_MAP'е ( вычисления таблиц шагов по текстуре, таблиц шагов по текстуре светового пятна, интерполяцию вершин полигона по текстуре и по текстуре светового пятна, и т. д. ) Warning ! Данный алгоритм будет работать только с выключенными прерываниями !!! Подумайте немного сами, как сделать так, чтобы не зависало при IM 2 ;) Ну вот вроде и все. Как видите для того, чтобы сделать T_MAP + PHONG сначала нужно понять как работает обычный T_MAP. Если будет заинтересованность редакторов журнала, то Mы ( EI ) можем рассказать об реализации на ZX таких эффектов как: 3d-камера, Static Phong Shading or Environment Mapping, Morphing Stretch-tables, Z-buffer, S-buffer, alpha-channel, Mirroring rotation, Fast Scaling, 3d-Particles, 3D Spheres 3D Tunnels, Lens Flare, любой вид 3D-shading'а и многое другое. Senat/Eternity Industry. 18.09.999
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября