Обратите внимание - я специально не стал в данном случае делать голосования, т.к. в него часто тыкают незадумываясь, а это весьма важный вопрос на самом деле. Тут надо чтобы те, кто понимает о чем речь написали свое взвешенное мнение о проблеме.
Итак, в классическом виде мы имеем ту самую задачку про два стула.
Или, проще говоря - два формата хранения полигональной геометрии для XashNT. Оба формата уже созданы, оттестированы и опробованы в деле.
Расскажу про них поподробнее в хронологическом порядке:
1. Compiled Static Mesh (.csm)
Содержит в себе статичную геометрию в виде треугольников и вертексов.
Вертексы имеют позицию, текстурные координаты и координаты лайтмапы.
А так же некоторые полезные флаги-подсказки для процессинга геометрии.
Формат с динамическим процессингом, т.е. компилятор может производить над ним различные действия - например индексировать вертексы, генерировать развертку для лайтмапы, итд.
Формат имеет очень простую дисковую структуру в духе первого квейка:
C++ Source Code:
1
struct csm_header_t
2
{
3
uint32_t ident;
4
uint32_t version;
5
6
uint32_t flags;
7
uint32_t lmGroups;
8
uint32_t reserved0[4];
9
bbox bounds;
10
uint32_t reserved1[4];
11
12
uint32_t mat_ofs;
13
uint32_t mat_size;
14
15
uint32_t faces_ofs;
16
uint32_t face_size; // sizeof( csm_face_t )
17
uint32_t faces_count;
18
19
uint32_t vertex_ofs;
20
uint32_t vertex_size; // sizeof( csm_vertex_t )
21
uint32_t vertex_count;
22
};
Имена материалов не имеют ограничения на их длину и хранятся, как нуль-терминированная строка, где каждый материал декорирован двойными кавычками и разделён пробелом. Сделано всё, чтобы имплементация этого формата прошла без проблем на любом языке программирования, включая и скриптовые органиченные языки, которые умеют читать файлы с диска.
Минусы: учитывая классическую организацию, формат является практически нерасширяемым. Мета-информации нет, возможности по замене\добавлению новых структур практически отсутствуют. Ну собственно, как и в аналогичных форматах, вы видите присутствует несколько резервных переменных, которые можно использовать для этого.
Но на этом как бы и всё. Произвольную информацию этот формат содержать не может. Отдельный вопрос - нужны ли такие возможности такому формату. Если бы я знал на него ответ, то не создавал бы эту тему.
2. Uniform Source Mesh (.usm)
Данный формат использует для хранения данных унифицированный контейнер, разработанный специально для XashNT. Контейнер содержит абстрактные секции, которые могут иметь произвольное имя длиной до 255 символов, размер каждой секции не может превышать 4GB, однако размер самого контейнера ничем не ограничен. В начале контейнера точно также содержится четырёхбуквенный идентификатор, однако спецификации стандарта могут предполагать и его полное отсутствие. В этом случае тип файла вычисляется путём анализа именованных секций на предмет совпадения с ключевыми именами. Для тех кому непонятно - поясню. Имена секций могут быть частью стандарта того или иного формата. Например наличие вертексных и индексных буфферов однозначно указывает что мы имеем дело с геометрией. Наличии секции с именем "bones" говорит о том, что это модель скелетной анимации. Это разумеется для примера, в контейнере со статической геометрией костей нет. Так же контейнеры на уровне концепции устойчивы к повреждению данных, у них может быть запорчен хвост, начало или середина, однако загрузчик пропустит только испорченную секцию и сможет загрузить целые, поскольку содержит встроенный поиск, аналогичный тому, который используется программами для восстановления данных, но включает его только в случае обнаружения повреждённых секций (поскольку такой поиск медленее нормальной загрузки).
Что же касается самого формата usm, то на данный момент он максимально близок к спецификациям csm (поскольку из них и создавался), однако благодаря использованию вышеописанного контейнера может расширяться до бесконечности. В такой формат можно сохранять любые другие файлы в виде секций, включая и рекурсивное вложение таких же мета-контейнеров. Т.е. потенциально здесь очень большие возможности для будущих расширений, если они вдруг понадобятся. Собственно эти контейнеры используются XashNT абсолютно для всех остальных типов данных, исключая вышеописанный формат .csm
Минусы:
Абстрактный мета-контейнер сложнее имплементировать пользователям, к тому же я не уверен, что это возможно эффективно сделать на произвольном языке программирования. К тому же в формате есть как минимум поддержка одного стандарта компрессии - LZSS. Распаковка на скриптовом языке может быть довольно медленной. Я не великий знаток явы и сишарпа, поэтому вообще не уверен, реально ли реализовать подобные вещи на них. И это ещё одна из причин, по которой я создал эту тему.
Собственно вопрос: поскольку программ для моделирования великое множество, я сделаю один из этих форматов открытым, чтобы вы могли самостоятельно внедрять его поддержку. Вот и вопрос - что для вас более предпочтительно?
Высказывайте свои соображения, давайте придём к какому-то итогу.
Неясно, как CSM может быть заменой для SMD, если в себя не включает по дефолту скелетную анимацию и прочие фичи из SMD? Можно сказать, что это более унифицированный формат и он не должен иметь в себе такие частности, но получается что нам надо самим:
1. Реализовать в компиляторе моделей (это уж ладно, тут ничего не поделать)
2. Создавать свой плагин для условно блендера, который мог бы анимации экспортировать.
По итогу получается много работы, и притом нелёгкой. Да и к тому же это всё вообще противоречит унификации.
SNMetamorph писал: Неясно, как CSM может быть заменой для SMD
CSM и не может. Он создавался именно для статичной геометрии.
Однако варьируя размеры вертекса\фейса, мы можем сохранять туда какую-то иную информацию, втч и вертексы с костями. Минус в том, что привязка к однму лишь размеру структуры - не слишком надёжная вещь. Т.е. это будет напоминать всё те же пляски с расширением голдсорсовских форматов, когда по всяким неявным признакам определяется, что это расширенный формат или вообще какой-то другой.
А еще, зачем вшивать описания материалов в статик меш? Или там не описания, а просто ссылки на материалы? Как я понимаю, материал это вообще должна быть отдельная сущность, на которую много откуда можно ссылаться.
SNMetamorph писал: Или там не описания, а просто ссылки на материалы?
Да, просто ссылки - т.е. имена материалов. Описания хранятся снаружи.
Собственно эти ссылки могут быть чем угодно - как именами материалов так и относительными путями к текстуре. Это никак не регламентируется.
Добавлено 27-04-2023 в 15:31:
Не помню говорил или нет, но концепция универсального текстового формата-описания у меня тоже имеется, но к ней спеки выкладывать нет особого смысла - достаточно открыть такой файл в блокноте и сразу станет всё понятно. Там тоже именованные секции фигурных скобок.
Дядя Миша писал: Собственно вопрос: поскольку программ для моделирования великое множество, я сделаю один из этих форматов открытым, чтобы вы могли самостоятельно внедрять его поддержку. Вот и вопрос - что для вас более предпочтительно?
Да никак, надо писать конвертеры например obj или fbx в твой формат. Ну либо реально заниматься свистопляской со скриптами внутри пакетов и писать отдельную библиотеку которая буквально будет эмулировать твой парсер. Ибо писать парсер персонально для каждого 3д пакета это задача практически нереальная. Для парсинга Жсона например уже библиотеки есть.
Цитата:
Дядя Миша писал: текстурные координаты и координаты лайтмапы.
В моделинге нет такого понятия как текстурные координаты и координаты лайтмапы, там просто UV она может быть одна, а может быть 10 или к примеру 20. Зачем их ограничивать до 2х, непонятно. А ещё есть вертексколор к примеру.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал: Да никак, надо писать конвертеры например obj или fbx в твой формат.
Конверторы в мой формат, я разумеется напишу самостоятельно и в достаточном объеме. Речь о том, чтобы программы для моделирования могли мой формат загружать и сохранять. Ну и чтобы люди могли его использовать в своих проектах без ограничений. Он для того и создавался.
Цитата:
FiEctro писал: а может быть 10 или к примеру 20. Зачем их ограничивать до 2х, непонятно.
Затем, что 2 развертки - это самый частый кейс в игродеве. А большего кол-ва их попросту не нужно, т.к. остальные развертки элементарно генерятся уже налету в шейдере из этих двух существующих.
Но ты конечно можешь привести пример, когда тебе вдруг понадобилась там третья или четвертая развертка.
Добавлено 27-04-2023 в 16:20:
Вот возьмем формат хранения мешей в унреале. Там предполагается восьмиканальная развертка. Видимо ещё со времён FFP, когда это имело ну хоть какую-то теоретическую пользу. То есть с одной стороны - мешы здоровые просто потому что в них куча неиспользованного пространства, я изучал сорцы но так и не увидел там использования более двух каналов.
С другой стороны, а разве восьми каналов достаточно? Всегда же найдется какой-нибудь ФиЭктро, который спросит, а где бамп, а где тени, а где ротатабля, возиться, итд.
Дядя Миша писал: С другой стороны, а разве восьми каналов достаточно? Всегда же найдется какой-нибудь ФиЭктро, который спросит, а где бамп, а где тени, а где ротатабля, возиться, итд.
Ё-моё. Ну возьми ты открой любой нормальный 3д пакет, и посмотри как там устроено. Ну да, ФиЭктра видимо блендер с 3д максом написал...
И вообще прекращай искажать мои слова, ротатабля в ксаше всю жизнь была.
Цитата:
Дядя Миша писал: Но ты конечно можешь привести пример, когда тебе вдруг понадобилась там третья или четвертая развертка.
Детальные текстуры. Всякие движущиеся элементы, например конвееры. Смешивание текстур с разным скейлом и поворотом на террейне да и много всяких таких мелочей. К слову и лайтмап то может быть несколько, или ты предлагаешь использовать одну мегатекстуру разрешением в 64к?
Цитата:
Дядя Миша писал: Речь о том, чтобы программы для моделирования могли мой формат загружать и сохранять.
Тогда лучше сделать библиотеку. Желательно открытую, чтобы её могли портировать под другие платформы. Тогда написание плагинов заметно упростится.
Цитата:
Дядя Миша писал: Затем, что 2 развертки - это самый частый кейс в игродеве.
На дворе уже 2023 год, а не 1998й. Зайди на Gamedev.ru и расскажи им про это, думаю над тобой посмеются.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
умножение текстурной развертки на пользовательский скейл - вычисляется в шейдере элементарно. Хранить смысла нет.
Цитата:
FiEctro писал: Всякие движущиеся элементы, например конвееры
Смещение развертки на скорость * время кадра движения конвейера - вычисляется в шейдере элементарно. Хранить смысла нет.
Цитата:
FiEctro писал: Смешивание текстур с разным скейлом и поворотом на террейне да и много всяких таких мелочей.
Ну поскольку эти текстуры фактически используют автогенерацию текстурных координат, то и поворот на заданный угол - вычисляется в шейдере элементарно. Хранить смысла нет.
Цитата:
FiEctro писал: К слову и лайтмап то может быть несколько
В каком смысле - несколько лайтмап? Несколько лайтмап для одного треугольника?
Цитата:
FiEctro писал: или ты предлагаешь использовать одну мегатекстуру разрешением в 64к?
Между прочим для ландшафта проективная развертка точно так же элементарно вычисляется в шейдере - хранить смысла нет.
Повторюсь, я очень долго думал куда в игродеве использовать дополнительные развертки. Очень долго. Вполне возможно что в каких-то других областях это востребовано. Но не тут. Впрочем спор ни о чём.
Т.к. я не настаиваю на использовании формата, содержащего только две развертки, а наоборот с вами советуюсь.
Цитата:
FiEctro писал: Зайди на Gamedev.ru и расскажи им про это, думаю над тобой посмеются.
Эпоха мультиразверток возникла во времена фиксированного конвейера, потому что на тот момент это был ЕДИНСТВЕННЫЙ способ создавать какие-то эффекты. Но в том-то и дело что подавляющее большинство разверток требуют либо локальной модификации, либо относятся к разновидности очередной проекции. Единственные две развертки, которые нельзя построить в изолированном пространстве - это вот как раз текстурная и лайтмапная. Если ты до сих пор этого не понял - зайди на геймдев.
Цитата:
FiEctro писал: Тогда лучше сделать библиотеку. Желательно открытую, чтобы её могли портировать под другие платформы.
Так я про то и толкую блин. Ну сделаю я библиотеку с примерами, а мне потом скажут - этот код на шарп не портируется или что-то вроде этого.
Откуда я знаю?
Дядя Миша писал: Так я про то и толкую блин. Ну сделаю я библиотеку с примерами, а мне потом скажут - этот код на шарп не портируется или что-то вроде этого.
Откуда я знаю?
Я с Апи на разных языках не работал, могу ошибаться. Но так многие приложения на шарпах/яве/питоне взаимодействуют с библиотеками на крестах.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Ну и ок, правда я хз как втраивать эти заголовочные файлы в питон или шарп. Там же свой синтаксис. В любом случает ДЛЛку надо делать.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Ладно, раз какого-то однозначного мнения нет, а большинство вообще не поняло, чём речь, приму промежуточное решение - будем пока что использовать текстовый формат .smd
Он широко распространённый, полностью удовлетворяет текущим условиям, csm, usm - это скорее для масштабных карт, как в Lost Alpha какой-нибудь, чтобы не ждать, пока компилятор их пересчитает. Так что пока обойдемся.