Closed 0x4E69676874466F78 closed 2 years ago
wadname.wad
тупо аналог WAD файла, для совместимости и удобства замены существующих текстур.
Думаю, вместо этого лучше сделать папку pbr_replacements/wadname
внутри которой уже будут текстуры с такими же именами, как в самом WAD-файле
@SNMetamorph
wadname.wad
тупо аналог WAD файла, для совместимости и удобства замены существующих текстур.Думаю, вместо этого лучше сделать папку
pbr_replacements/wadname
внутри которой уже будут текстуры с такими же именами, как в самом WAD-файле
Так это и подразумевается, внутри pbr_replacements/wadname.wad/ будут лежать текстуры из вада wadname.wad. А что касается убирания .wad из имени папки, дело в том что wadname без .wad потенциально может создать конфликтную ситуацию когда название WAD файла в каком-то из модов может оказаться одним из названием других папок (maps, models, sprites, gfx) что приведёт к замусориванию структуры или конфликту материалов что придётся изворачиваться. Далеко ходить не надо, valve/pbr_replacements/gfx/ уже пересекается с gfx.wad но это безобидное пересечение так как оно в плане шрифтов (но не неба-окружения) вроде повторяет valve/gfx/ но с другим может оказаться не так.
@SNMetamorph спс, переписал эту строчку чтобы не было разночтений.
Надо ещё подумать над тем как патчить энтити света, добавлять новые, в плане того где и как это описывать.
И решить вопрос чтобы можно было распространять данные об освещении отдельно от PBR-текстур чтобы можно было не качать жирный PAK/ZIP с текстурами если хочется поиграть с ванильными текстурами.
А detail map надо? Легко добавить теперь.
@w23 всё взвесив думаю сейчас нет, в самый последний момент можно если время останется. Самая крупная модификация использующая их Day of Defeat даже не имеет бранча сдк (я не нашёл). В контексте PBR для той же халфы по хорошему одной текстуры поверх basecolor мало, нужно всю пачку (с припиской _detail
) чтобы были микроповерхности со своей реакцией на свет, но пока у нас 1280х720 этого даже разглядеть толком не получится.
Лучше это время потратить на вынос UI на отдельный слой а то на HDR-патче текст выжигающий.
Данный документ почти полностью устарел в виду новой информации и лучшего понимания реалий, закрываю его.
Пока напишу по-русски и сумбурно, это набросок, потом переделаю структуру и переведу, это в любом случае надо на двух языках. I will write in Russian and chaotically for now, this is a sketch, then I will redo the structure and translate it, in any case it is necessary in two languages.
Возможно документ может показаться переусложённым, но стоит это рассматривать как возможности на вырост (он продуман с позиции качества), а приоритеты определяете сами.
Список задач
В скобках
[]
собственное оценочное суждение о приоритете.Чтение из ZIP-архива [низкий]В Xash есть поддержка PAK и ZIP."force_render_mode"
[средний]"framerate_multiplier"
[средний]"scale_multiplier"
[высокий]"очень низкий" — что потенциально может понадобиться, но скорее всего вряд ли, либо просто хотелка. "низкий" — скорее всего понадобится, но можно обойтись. "средний" — можно обойтись, но придётся мириться с большими недостатками.
Наследие/Legacy
WAD, MDL, SPR для улучшенных текстур использовать не самая хорошая идея, с ними только лишние заморочки как в разработке так и артистам. Например у них обязательная палитра в 256 цветов и тот же Wally не умеет упаковывать больше 2048х2048 (возможно другие редакторы могут, не проверял). Можно конечно воспользоваться pngquant, но это всё потери качества и не везде вытянет. Тем не менее, старые форматы поддерживать стоит, если у текстуры нет замены, должен быть fallback в обычный рендер по палитре с прозрачностью из неё и т.п. короче не сломать совместимость.
Улучшенные текстуры
Предлагаю текстуры держать в DDS или KTX2 с поддержкой форматов от BC4 до BC7, тогда можно иметь хорошее сжатие и как бонус можно работать над мипмапами, сделав их более качественными чем обычно (банально добавить резкость). Улучшать текстуры можно в два прохода:
Планирую отдельную статью в вики с описанием того как всё это сделать.
Структура файлов
Примечание: структура ещё сырая. vulkan_ убрал так как PBR материалы потенциально могут быть использованы в PrimeXT
valve
это имя мода. У движка HL есть особенность что можно в карте для того же CS использовать текстуры из WAD директории valve, они прописаны в карте, этот механизм надо учитывать и грузитьpbr_replacements
из других папок если потребуется./wadname.wad/
папка ассоциированная с распакованным WAD файлом, для удобной замены существующих текстур новыми материалами./maps/mapname/
материалы из этого каталога применяются к конкретной картеmapname.bsp
, имеют приоритет над/wadname.wad/
. Возможно потребуется перекрытие/models/modelname/
,/sprites/spritename/
,/gfx/env/envname
если есть вхождение внутри/maps/mapname/
, но на первом этапе это не нужно./models/modelname/
материалы из этого каталога применяются к конкретной моделеmodelname.mdl
/sprites/spritename/
материалы из этого каталога применяются к конкретному спрайтуspritename.spr
/gfx/env/envname
материалы из этого каталога применяются к конкретному окружению (небу)envname
Внутри WAD и MDL файлов лежат имена текстур, эти имена используются внутри папок выше, только в силу того что у нас PBR файлов не один, а множество, формат именование файла:texname_typeTexture
гдеtexname
имя исходной текстуры, аtypeTexture
это в случае Metallic/Roughness:basecolor
,metal
,roughness
,normal
; а в случае Specular/Glossiness:albedo
,specular
,glossiness
,normal
. Возможны ещё дополнительные текстуры для подповерхностного рассеивания (sss
), для тесселяции (displacement
). Прозрачность можно хранить в альфаканале уbasecolor
/albedo
. Для жидких текстур параметры из палитры (см. #37) будут описаны в файле материала. Сам файл материалаtexname.mat
.Возможность хранить файлы в архивах
У Xash есть поддержка PAK, она должна работать и в случае pbr_replacements. Чтение из архива будет быстрее чем из распакованной структуры в ФС и проще распространять.
Материалы
Примечание: структура ультра сырая.
Общее
Чтобы заменить оригинальную текстуру материал должен внутри себя иметь настроенный параметр
"replace_for"
. Для удобства лучше называть материал именем оригинальной текстуры, если это возможно. Явное определение лучше чем неявное в силу того что потом не потребуется изменение формата если вводить специфику замен материалов конкретных брашей на конкретных картах. Материалы позволяют заменять текстуры на всех картах (учитывая видимость файловой структуры), на конкретных брашах, на моделях (у моделей свой набор отдельных текстур), на спрайтах. Браши заменяются по ихid
иface_id
, спрайты поentity_id
, модели поentity_id
иtexture_name
. Например можно на конкретной карте подменить в конкретном месте спрайт специальным искажающим шейдером. Материалы могут перекрывать режим отрисовки (Render Mode) на свой собственный, в силу того что каким-то шейдерным эффектам это не нужно.Ограничения PBR
Желательно иметь оба подхода Metallic/Roughness и Specular/Glossiness так как оба имеют свои преимущества и недостатки, из важного:
Формат
Это общий пример того как может выглядеть описание материала, оно не полное. JSON для примера.
Для выбора подхода есть ещё вариант делать один шейдер, где внутри шейдера указывать какой подход (workflow) используется (выбирается режим, типа
"workflow": WOKFLOW_MODE_METALLIC
), вместо двух шейдеров как сейчас (general-Metallic-Roughness-workflow.glsl и general-Specular-Glossiness-workflow.glsl), но я не знаю как оптимальнее с точки зрения производительности и потребления памяти, чище кажется раздельно.Спрайты
Спрайты тоже можно расширить — увеличить размер и частоту кадров (уплавнить через SVP и RIFE). Для увеличения размера и частоты надо ещё сами энтити патчить в карте, а точнее параметры framerate и scale у каждой. Для этого в материале спрайта указывается параметры
"framerate_multiplier"
"scale_multiplier"
, они задаются целочисленные, то есть было 10 кадров у спрайта, стало 20, значит множитель 2, сделали 60 кадров значит множитель 6, дальше этот"framerate_multiplier"
множится на все энтити с этим именем спрайта к значению параметраframerate
у энтити, так чтобы анимация была той же самой просто плавнее. У размера похожая логика, увеличили размер вдвое значит"scale_multiplier"
2 (если мы просто увеличим вдвое текстуру, то спрайт на карте вдвое большего размера станет). Спрайты хранятся как обычные текстуры, в случае с анимацией в конце постфикс_num
гдеnum
это порядковый номер кадра. В материале указывается режим анимации. Материал может и не содержать анимацию вовсе, иметь несколько текстур и быть задан специальный шейдер с процедурной анимацией.Окружение (и небо)
В оригинале окружение состоит из 6 отдельных текстур (каждая на сторону), формат:
texnameside.tga
(24-бит) илиtexnameside.bmp
(8-бит). Гдеside
принимает один из возможных вариантов:bk
,dn
,ft
,lf
,rt
,up
. Можно взять исходные текстуры, увеличить и попробовать сделать их в HDRI руками, банально задав разное свечение для неба, земли и солнца, сымитировав настоящий HDR. В таком случае формат может быть .HDR (RGBE/Radiance HDR) или .EXR (OpenEXR), в обоих случаях это один файл на все стороны, говорят с последним проще работать в плане редактирования и возможностей и думаю лучше его взять ибо готовых решений для последнего больше. Ещё можно хранить в DDS или KTX2 в формате сжатия BC6H который предназначен для HDR. Требуется более глубокое изучение вопроса в том как эффективно хранить HDR. Для каждого неба свой mat файл с параметрами ("tint_color"
,"lux"
,"rotation"
). Таким образом через HDRI можно влиять на освещение карты (там где материал SKY) чтобы оно идеально ложилось под атмосферу окружения. Данный подход много где успешно применяется.