|
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
Другие статьи номера:
Похожие статьи:
В этот день... 30 октября