Разрабатываю 3D-движок для Dendy
Всем привет. Я уже года полтора зимаюсь разработкой игр для консоли денди/NES/Famicom. Все мои игры имеют классическую спрайтовую 2D-графику, но периодически меня посещали мысли реализовать 2.5D и честную 3D графику для денди.
Это задача не совсем тривиальная, но я решил побороться за возможность работать с полигональными моделями на денди. И за несколько недель набросал простой 3Д-движок.
Основной сложностью было то, что денди не дает возможность редактировать отдельные пиксели, можно редактировать только целые тайлы (тайлы - это плитки 8х8 пикселей). Поэтому, чтоб нарисовать пиксель в случайном месте экрана, нужно подготовить тайл, который содержит пиксель в нужном месте. А потом этот сгенерированный тайл нужно вывести в правильное место экрана. Довольно сложный механизм.
На данном этапе я почти закончил 2D-движок (осталось доделать вывод залитых треугольников любого вида, задача не совсем очевидная, если стараться все оптимзировать и использовать 8-битные переменные).
Кроме 2д-графики реализовал алгоритм определения угла наклона полигона относительно луча от камеры. Определение угла нужно для расчета теней и видимости полигона (на превью невидимые полигоны не выводятся).
В остальном вывод 3д-модели - это просто рисование треугольников на плоском холсте. Ничего сверхъестественного.
Для вывода более зрелищных моделей мне осталось реализовать вывод цветных залитых треугольников и поэкспериментировать с расчетом освещенности полигонов для вывода теней.
Сегодня вот добавил возможность вывода разноцветных пикселей одновременно (можно использовать 4 цвета одновременно):
С цветной картинкой была основная сложность с реализацией буфера видеопамяти. Пришлось мудрить с распределением памяти, так как доступной оперативки у меня был всего 1 килобайт (даже чуть меньше на самом деле), но в итоге все получилось.
На выгрузку буфера в видеопамять требуется примерно 4-5 кадров (при 60 фпс). А для вывода 10 полигонов требуется примерно 5-10 кадров. Значит должно получиться сделать какую-то динамичную 3д-сцену или простенькую аркаду (пишите ваши идеи простой 3д-игры).
Из оставшихся задач для 3Д нужно реализовать матрицу трансформации или хотя бы просто механизм вращения. Если будет механизм вращения, уже можно будет заняться 3Д-демкой полноценной.
И вот еще несколько экспериментов с 3д-моделями:
Свежие версии моих игр выкладываю на странице на итч.ио - https://swamptech.itch.io/
Информацию по проектам и обсуждение изменений с подписчиками веду в ТГ - https://t.me/Swamp_Tech
Через 2-3 недели на хабре выпущу большую статью техническую про разработку 3д-движка (на пикабу такие статьи не заходят, к сожалению) - https://habr.com/ru/users/Swamp_Dok/
Всем спасибо за внимание.




Лига Разработчиков Видеоигр
9.3K постов23.2K подписчика
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"