Info Guide
#12
31 декабря 2017 |
|
Код - 3D скролл на ZX Spectrum (часть 1).
3D скролл на ZX Lord Vader/MAYhEM Предисловие Эта статья была написана в 2014 году для журналаSpectrum Today #2.С тех пор, однако, прошло много времени и стало ясно, что, по-видимому, никакого Spectrum Today #2 уже не будет. Посему статья была напра─ влена в электронный журналInfo Guide #12, который как раз подбирался к релизу. Оста─ валось только перевести статью на рус─ ский... Введение Эта статья - про полноэкранный 50 FPS 3D скролл, такой, какой можно увидеть в деме New Wave 48k, зарелизенной наForever в 2013 году. Ну, или какой можно увидеть в деме на Commodore 64 под названием Trick and Treat. Я не претендую на лавры изобретателя этого эффекта. Всё, что я сделал - подсмо─ трел реализацию в вышеназванной C64-деме, переосмыслил и закодил на ZX. Статья состоит из нескольких частей. Вначале приведён мини-обзор похожих эффек─ тов. Далее вводится некоторая терминология для облегчения повествования. Наконец, описываются ключевые идеи и приводятся примеры кода. Внимание уделяется и т. н. precalc'у. В последней части приведены мои соображения по возможным улучшениям эффек─ та, а также (самое главное!) передаются спасибки тем, кто мне помог с реализацией эффекта и написанием этой статьи. Исторический обзор Небольшая подборка исторических (и не очень) дем, в которых было/есть что-то по─ хожее на 3D скролл. А Б В Г Д Е Satisfaction Megademo (рис.1) 1994, 3D скроллер из одиночных отдель─ ных пикселей,и при этом даже не one-frame. Малозначим в контексте данной статьи. 4K интро под названием 4k intro (рис.2) Написана в 1995 году и увидела свет на Фантопе. Перспективно-корректный 50 FPS 3D скролл,вместо сплошных текстурных пикселей также бывают узорные. Каждая линия по мере скролла побитово 'сжимается' по границам байтов. Кроме того, по мере движения вверх некоторые линии исчезают. Такой подход не вполне точен и расходует довольно много тактов Z80, потому-то эффект и занимает такую небольшую площадь на экране. Adventurer #3 e-zine (рис.3) 1996, имеет совершенно фейковый скролл с неправильной (или отсутствующей) перспе─ ктивой, из-за чего кажется,что буквы вытя─ гиваются в высоту по мере удаления от зри─ теля.Полноэкранный,но 25 FPS. Каждая линия побитово сжимается на границах байтов, что тоже не вполне корректно. Демо Trick and Treat (рис.4) Для C64, 2008, имеет настоящий (с вер─ ной перспективой) 3D скролл.Именно из этой демы я позаимствовал основную идею такого скролла. Звёзды на экране сделаны аппарат─ ными спрайтами C64. Нюансы: все символы в шрифте всегда имеют ширину 3 текстурных пикселя и 1 пиксель пустого места между ними. Кроме того, в некоторых местах линии скролла искажены.Эти недостатки могут быть объяснены недостатком вычислительной мощи процессора 6510 и ошибками precalc'а,соот─ ветственно. Agony Megademo (рис.5) 1993. Тут 3D скролл весьма своеобразен: одна буква занимает всю ширину экрана. Тем не менее, перспектива не испорчена, и всё работает в 50 FPS. Код рендеринга не самый оптимальный, но вполне на уровне для 1993 года. Предположительно, это первый полно─ экранный перспективно-корректный 50 FPS 3D скроллер на 8-битной машине. Демо Eldorado для C64 (рис.6) 1994. Предположительно,это самый ранний скролл по типу "Звёздных войн"(кстати, в кино он встречался и до "Звёздных войн" - Buck Rogers (1939), Светлый путь (1940), Flash Gordon (1941) -Ред.).Тем не менее, это фейк (см. также 4k intro ): лишь ими─ тация сжатия по вертикали путём выкидыва─ ния некоторых линий и сжатие по горизонта─ ли по границам байт. Кроме того,это совер─ шенно не 50 FPS! RGB C64 демо (рис.7) 2014. На момент написания статьи это был самый свежак с патиX'2014.3D скролл тут сделан тем же человеком, что и в деме Trick and Treat, почти с таким же кодом. Главное отличие состоит в том, что скролл тут заезжает на боковую часть бордюра C64. Конечно, рисование спрайтов на боковом бордюре на коммодоре - это не так просто, но к сути эффекта не относится,т.к.пиксели спрайтов изображаются из байтов точно так же, как и пиксели основного экрана C64. Отличающееся строение экрана и спрайтов значения не имеет, так как каждый изменяе─ мый экранный (и спрайтовый) байт записыва─ ется командойSTA absс вполне определён─ ным адресом в ней.Кроме того,тут уменьшено вертикальное разрешение (строки дублируют─ ся),что позволяет разменять количество ли─ ний, требующих рендера,на двойное сохране─ ние каждого видимого экранного байта.Этого не избежать - ведь поддержание видимости спрайтов на боковом бордюре C64 - весьма затратная (по тактам) операция для 6502!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября