Самодельный 3D движок с открытыми исходниками

Форум для пользователей и разработчиков игрового мира Виртбург http://virtburg.com

Moderator: Shaos

Post Reply
User avatar
Shaos
Admin
Posts: 23676
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Самодельный 3D движок с открытыми исходниками

Post by Shaos »

Shaos wrote:Реализовал алгоритм дизеринга панорамы с распространением ошибки вниз и вправо с постепенным "растворением" (colorerror /= 1.03):

Image
Стал при распространении вправо делить ошибку ещё раз по-полам - теперь немногочисленные повторяющиеся артефакты практически исчезли:

vburg0001.jpg
vburg0001.jpg (367.04 KiB) Viewed 199 times

Надо наверное прояснить вопрос того, как я собственно делаю дизеринг в отличие от классического Флойда-Стейнберга:

https://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering

dithering.jpg
dithering.jpg (16.04 KiB) Viewed 199 times

Во-первых, следует пояснить, что я делаю обход картинки не слева-направо, а сверху-вниз, соответственно Флойда со Стейнбергом надо поднять из положения лёжа и поставить вверх-тормашками (как нарисовано слева вверху) - в моём случае я не хотел его использовать т.к. оно потребовало бы больше дополнительной памяти, поэтому поначалу у меня было совсем просто (вообще без дополнительной памяти) - ошибка распространялась вниз с угасанием 97% (см. Shaos #1) - в этом случае картинка получалась "полосатая". Потом, как написано выше, я стал делить ошибку на пополам и распространять её не только вниз, но и вправо (см. Shaos #2) - это потребовало наличия дополнительных массивов ошибок по цветам размером равным высоте панорамы и результат в большинстве случаев стал приемлемым, но на небе иногда попадались диагональные артефакты при переходе из голубого в бирюзовый. После нескольких неудачных вариаций я вчера таки придумал делить правую ошибку ещё раз пополам и откладывать её ещё и вправо-вверх (см. Shaos #3) - теперь результат практически идеальный :mrgreen:

vburg0002.jpg
vburg0002.jpg (477.65 KiB) Viewed 199 times

P.S. А вот как новый алгоритм выглядит в FullHD (1920x1080) 8)

 FullHD

vburg0005-hd.jpg
vburg0005-hd.jpg (1.02 MiB) Viewed 181 times


P.P.S. Кстати при сохранении в JPEG оно немножко сглаживает точки - возможно надо сохранение в PNG прикрутить вместо JPEG, чтобы было сжатие без потерь...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23676
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Самодельный 3D движок Virtburg

Post by Shaos »

Shaos wrote:
Shaos wrote:Остающиеся снаружи GIF-декодер и класс виртуального диска (используется для чтения слепленных вместе стандартных текстур) также будут убраны до того, как я опубликую исходники...
Всё - выкинул поддержку виртуального диска VDS (мой собственный формат склеенных вместе файлов, выдуманный в 1996 году) и чужой GIF-декодер (точнее перенёс декодер во внешнюю утилиту для конвертирования GIF в TXR: https://gitlab.com/shaos/virtburg/-/blob/master/tools/gif2txr.c, сконвертировав все GIF-ы что оставались в TXR-ы)...
Наверное надо поддержать сжатие текстур через свой паковщик SHAFF (быстрый байт-ориентированный вариант 0) - сжатие при этом может получаться более чем в 15 раз:

Code: Select all

-rw-r--r-- 1 shaos shaos 42242 Dec  8 23:09 sign-banks.txr
-rw-r--r-- 1 shaos shaos  2773 Dec  8 23:59 sign-banks.txrFF
-rw-r--r-- 1 shaos shaos 42242 Dec  8 21:56 sign-center.txr
-rw-r--r-- 1 shaos shaos  2705 Dec  8 23:59 sign-center.txrFF
-rw-r--r-- 1 shaos shaos 42242 Dec  8 23:47 sign-intergalactic.txr
-rw-r--r-- 1 shaos shaos  3306 Dec  9 00:04 sign-intergalactic.txrFF
-rw-r--r-- 1 shaos shaos 42242 Dec  8 23:08 sign-port.txr
-rw-r--r-- 1 shaos shaos  2445 Dec  9 00:05 sign-port.txrFF
-rw-r--r-- 1 shaos shaos 42242 Dec  8 23:18 sign-shaos.txr
-rw-r--r-- 1 shaos shaos  2904 Dec  9 00:05 sign-shaos.txrFF
Сохранять текстуры можно с тем же расширением .txr и просто при чтении проверять если файл начинается с сигнатуры SHAFF0, то производить распаковку при загрузке в память.

P.S. Ради интереса сравнил степень сжатия разными паковщиками:

Code: Select all

-rw-r--r-- 1 shaos shaos 42242 Dec  8 23:47 sign-intergalactic.txr <------ ORIGINAL (100%)
-rw-r--r-- 1 shaos shaos  3551 Dec  8 23:47 sign-intergalactic.txr.lz4 (8.4%)
-rw-r--r-- 1 shaos shaos  3306 Dec  9 00:04 sign-intergalactic.txrFF <---- SHAFF v0 (7.8%)
-rw-r--r-- 1 shaos shaos  2570 Dec  9 00:12 sign-intergalactic.txrFF1 <--- SHAFF v1 (6.084%)
-rw-r--r-- 1 shaos shaos  2570 Dec  9 00:16 sign-intergalactic.txr.hst (6.084%)
-rw-r--r-- 1 shaos shaos  2567 Dec  9 00:15 sign-intergalactic.txr.mlz (6.077%)
-rw-r--r-- 1 shaos shaos  2561 Dec  9 00:14 sign-intergalactic.txr.zx7 (6.063%)
-rw-r--r-- 1 shaos shaos  2546 Dec  9 00:15 sign-intergalactic.txr.hrm (6.027%)
-rw-r--r-- 1 shaos shaos  2328 Dec  9 00:14 sign-intergalactic.txr.zx0 (5.5%)
SHAFF0 получается лучше, чем LZ4, но хуже, чем всё остальное, а SHAFF1 на этом примере сравнялся с алгоритмом Hrust и отстаёт лишь на несколько байт от MegaLZ (3 байта), ZX7 (9 байт), Hrum (24 байта) и сильно отстаёт от ZX0 (но использовать я всё равно буду SHAFF0, т.к. его распаковщих простой и быстрый)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23676
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Самодельный 3D движок Virtburg

Post by Shaos »

Shaos wrote:... далее буду выкидывать остатки C++ которые заключаются в 3 классах внутри (shSprite, shObject и ObjLib) - их надо заменить на структуры (ObjLib это динамический массив объектов shObject, которые могут ссылаться на разные либо один и тот же спрайт shSprite) - и 2 классах снаружи (Text и Line предназначенных для построения односвязных списков текстовых строк) - они используются для представления ссылок для перескоков и кеширования спрайтов - это я заменю статическими массивами.

P.S. При переписывании класса shObject на голимый си можно сразу добавить поддержку анимированных спрайтов и спрайтов которые с разных сторон выглядят по разному (как в DOOM). Пока в моём движке спрайт всегда повёрнут "лицом" к наблюдателю, причём один и тот же shSprite может использоваться во многих shObject-ах...
Shaos wrote:... анимацию можно сделать прямо сейчас. Ещё прям сразу можно поддержать "карты спрайтов", когда разные итерации персонажа (и даже разных персонажей) навтыканы в одну картинку с фиксированным шагом, например такой объект можно описывать так:

Code: Select all

o0001 6.2 5.7 0 1.3 swin_2x3:5
что может означать, что мы берём TXR-файл swin_2x3.txr и предполагаем, что там сетка 2х3 из которой мы берём 5-ую по счёту картинку (если считать слева-направо-сверху-вниз начиная с нуля), а если там анимация 2 Гц, то так:

Code: Select all

o0001 6.2 5.7 0 1.3 swin_2x3:5,swin_2x3:4
(т.е. 2 картинки через запятую дают анимацию 2 Гц, а 3 картинки - 3 Гц и т.д. что даёт цикл анимации всегда ровно в 1 секунду).
Shaos wrote:Всё-таки резать надо не по цифрам из имени, а по цифрам идущими следом:
o0001 6.2 5.7 0 1.3 swin:2x3:5
Можно также ещё спрайт зеркалировать по горизонтали указав например тильду после имени спрайта:
o0001 6.2 5.7 0 1.3 swin:2x3:5~
Анимацию которая крутится всегда можно обозначать специальным значком, например @
o0001 6.2 5.7 0 1.3 swin:2x3:5,swin:2x3:4@
Если значка нет, то надо показать первый спрайт и ждать команды от скрипта (либо от сишного кода, который будет дёргать некий API)

P.S. Наверное можно запрограммировать поворачивание спрайта (путём выбирания следующего спрайта при обходе) в зависимости от того с какой стороны на него смотрят:
o0001 6.2 5.7 0 1.3 swin:2x3:5,swin:2x3:4,swin:2x3:3,swin:2x3:2&
( в данном случае можно ограничиться только 4 сторонами т.к. мы всё-таки не дум тут делаем, где было 8 )
Shaos wrote: Чтобы это всё поддержать надо добавить ещё один уровень абстракции:

- ObjLib это динамический массив объектов shObject;
- shObject это объект, который может ссылаться на разные либо один и тот же спрайт shSprite (+несколько спрайтов?);
- shSprite это абстрактный спрайт - сейчас один TXR-файл/картинка, но в будущем должен иметь возможность ссылаться на несколько картинок либо на разные части одной и той же картинки (чтобы поддерживать анимацию и вырезку кусочками);
- shImage это будет НОВЫЙ объект, обозначающий картинку, загруженную в память из TXR-файла (TXR формат это 2D картинка в 256-цветной палитре GamePal размером до 256х256 пикселов без сжатия).

P.S. Только надо будет переименовать эти штуки так, чтобы префикс был Virt, а не sh.
Я ещё нашёл в своих архивах код, который трогался последний раз в августе 2000 года, и он может рисовать настоящие 3D объекты внутри этого же самого движка, правда они должны быть выпуклыми и без текстур (цвет всей стороны одинаковый, но разные стороны могут быть окрашены в разный цвет). Ну ещё до кучи можно "проволочные" модели поддержать, когда объект рисуется не только полигонами, но и отдельными линиями. Рендерить это можно в тот же z-буфер, куда и плоские спрайты рендерятся, тогда они будут корректно закрываться кубами при необходимости. Такие типы объектов могут также представляться через shObject (т.е. теперь уже VirtObject).
Shaos wrote:P.P.S. В будущем надо будет ещё и мой графический формат 1995 года MYG поддержать - там есть прозрачность и RLE сжатие...
Пока можно обойтись TXR+SHAFF0
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23676
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re:

Post by Shaos »

Shaos wrote:...под SDL олдскульных софтверных 3D-движков не так уж и много - кому-то может и пригодиться...

кроме того можно этот 3D-движок позиционировать как недо-движок для недо-девайсов на которых нету OpenGL :)

ну и к тому же теперь это будет опенсорц под GPL (раньше был клозесорц с некоторым кол-вом открытого кода)
Репа для движка https://gitlab.com/shaos/virtburg с октября 2020 года уже имеет файл LICENSE с лицензией MIT внутри, т.е. этот движок можно будет вставлять и в закрытые программы тоже (с упоминанием лицензии и копирайта где-то в сопутствующей документации), а вот серверную часть я хочу выкатить под AGPL (самая строгая GPL), чтобы даже серверная инсталляция предоставляла полный исходный код (если кто будет делать клоны серверной части) и под серверную часть я сделаю новую репу, чтобы не мешать всё в одну кучу... и может быть даже сразу сделать серверную часть универсальной - типа первый прототип Realms ?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Post Reply