-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
materials: new format #470
Comments
Да, определённо нам надо как-то в этом плане совместимость обеспечить |
Начал я думать про то, как нам причесать и лучше организовать материалы. Свалю текущее понимание сюда. Набор параметров для отрисовки, из которых нужно сварганить материал, выглядит примерно так:
|
С другой стороны, в лучах было бы удобно потреблять описание материала, состоящее из:
Наблюдения:
|
Ща покормлю детей и закину сюда про то, как я предлагаю реализовать эту трансформацию, сек. |
Поправка: |
Раньше в ксаше был баг и текстура модели могла быть окрашена (но не заменена сплошным цветом) через ключ rendercolor с соответствующим rendermode, но сейчас этого бага больше нет и модель не может принять цвет теперь в этом плане поведение как и в goldsrc. Анимироваться цвет и раньше насколько я знаю не мог.
В реальности градации есть и хардкодить бинарное 0/1 не надо, пусть будет плавающим как сейчас. Иногда это очень полезно в сложных ситуациях.
Насколько я понимаю умножение цветом через base_color полностью повторяет это, то есть параметр избыточный по крайней мере в формате материалов.
По скорее бы! Хочется моделям добавить эмиссив текстуры, тем же блокам с аккумуляторами для костюма и для "реактора" гауспушки. |
Для выбора конечного материала для употребления лучеризатором должен использоваться следующий набор критериев:
Также не исключено, что нужен будет нелинейный маппинг из blend в transmittance. Но в простом варианте их достаточно перемножить. В простом варианте можно добавить к материалу параметр |
Ок, оставляем.
Сейчас у нас он есть отдельным параметром в формате материалов. Не знаю, насколько он используется.
Для красоты это добавить просто. Сложно сделать, чтобы оно влияло на освещение нормально, т.к. оно будет ломать семплирование. |
model_color? это когда он был добавлен? я не в курсе и он никак там не используется.
Ну как уже выяснили баги больше нет и красить модель не надо для соответствия ксашевому гл даже если там прилетает цвет через ключ энтити.
Ты про то что сложно потекстельно сделать маску для сэмплирования? Ну для начала можно сделать проще, пусть свет считается как из цельного полигона, но визуально освещение ограничено текстелями текстуры. Примерно что я предлагал для обычных светящихся текстур ограничением через эмиссив маски. |
Не, xash3d-fwgs/ref/vk/vk_materials.h Line 11 in aab689a
То есть там цвет вообще не учитывается никак?
Ага. Это сделать условно быстро. |
Всякие другие ишьи, релевантные вот этому всему:
|
Блин, я балбес, хайджекнул эту issue, которая была про совершенно другое 🥲. Начал пробовать начерновить всякую сыроту, как можно было бы сделать:
Но тут много непонятного:
|
Да модель нельзя никак покрасить, рендер-моды можно ставить (но не все работают), рабочие можешь посмотреть через карту test_bug_model_render_assassin, заморозь физику там (playersonly) иначе часть нападут, потому что я заметил была разная работа режимов на cycler энити и monster_* энтити. К #211 (и вообще) может быть релевантно FWGS#729 как я понимаю zgdump не в состоянии закончить, хотя осталось там не много:
|
Если такое делать то надо поменять формат у моделей и спрайтов, а то сейчас там: Возможно можно при Со спрайтами сложнее, так как есть кадры, но можно сделать примерно так же как с моделями только вместо имени текстуры там будут номера кадров, типа:
Что это такое?
Предлагаю переименовать в "for_geom" чтобы не было коллизий смысла, т.к. о моделях обычно думают о студиомоделях, а формат у нас для конечного пользователя. На тему Glow была идея там не режим подставлять, а кастомный шейдер (пусть и который мы заранее объявили и интегрировали). В остальном надо смотреть по ходу дела. |
Пока не очень понимаю, о чём именно идёт речь. Похоже, что это про несколько другую проблему?
Про кадры интересная проблема. Это уже какой-то недо-макро-язык нужно тащить. Боюсь, что руками по всем анимациям и кадрам пройтись будет тупо быстрее.
Это значит, что в лучах цвет этой геометрии должен смешиваться с тем, что за ней:
А
Оно там немного распределённое, нет одного простого места, куда воткнуть.
Ага, я пока склоняюсь к забить и захардкодить выставление |
Сейчас у нас для wad файлов не требуется писать импорт, достаточно создать папку с wadname.wad с файлом wadname.wad.mat внутри где уже определять что надо.
Не понимаю тебя какой макро-язык, сейчас мне приходится писать:
логичнее писать (когда у нас автоматические импорты как в случае с wad'ами)
На лету сгенерировать из файлового пути и значения for не должно требовать какого-то там макро-языка.
получить
не должно быть сложным. Тем более если делать по схеме wad то у тебя не просто путь у тебя понимание что там произошло определение модели/спрайта поэтому не должно быть нужным писать имя модели/спрайта для for.
А чем тебе geom не нравится? geom от geometry (такое сокращение есть в словарях с ожидаемым значением формы и т.п.), всё что ты описал геометрия, но source можно конечно тоже. |
Предварительные подробности относительно PrimeXT:
|
@SNMetamorph хочет расширение vmat, я думаю это не принципиально. |
Просто геометрия без текстуры, подозреваю что использовалось исходно как оптимизация, т.к. полупрозрачная текстура дороже. Например встречается в стёклах для труб на одном из уровней. |
Подытожим (пишу с точки зрения пользователя). Возможно это лучше перенести в новую issue, а эту закрыть. Новый формат будет JSON-совместим, это значит что его можно будет распарсить JSON-парсером. Нужно по аналогии с wad подгружать только необходимые материалы для моделей и спрайтов. Сейчас всегда инклудится всё через
Я предлагаю избавиться от мусора в "for", то есть в случае модели писать: Текстуры могут быть подгружены без всяких файлов материалов, для этого достаточно не описывать Совершенно отдельный режим работы для совместимости с PrimeXT.
Теперь непосредственно сам формат материалов. Создание материала {
"material": "MAT_NAME",
"base_color_map": "base.png",
"normal_map": "irregular.ktx2",
"base_color": "1 .5 0",
// ...
},
{
"material": "mirror",
"base_color_map": "white",
"base_color": "1 1 1",
"roughness": "0",
"metalness": "1",
// ...
} Назначение материала на текстуру {
"for": "+EXIT",
"use": "MAT_NAME"
} Возможно переопределение: {
"for": "+EXIT",
"use": "MAT_NAME",
"base_color": "1 0 0"
} Текстура по прежнему может быть описана без материала. {
"for": "wood",
"for_model_type": "brush",
"for_rendermode": "kRenderTransAlpha",
"use": "mat_glass",
"mode": "translucent",
"base_color_map": "glass2.ktx"
} {
"for_model_type": "brush",
"for_rendermode": "kRenderTransAlpha",
"mode": "translucent",
"map_normal": "glass1.ktx"
} Приоритет материалов решается просто, наибольшой полнотой, чем больше критериев тем приоритетнее блок над остальными. Отдельно про патчи: |
Ща погоди я сюда подытожу подытоживание, как я всё понял это, и прокомментирую.
Это "задача 1" (не в смысле приоритета, а просто номер).
Разумно и понятно зачем. Это "задача 2а".
Это "задача 2б". Её чуть сложнее сделать -- загрузка материалов становится контекстно-зависимой. Подозреваю, что её в общем виде сделать будет нетривиально, и по ходу реализации наломаем всякого.
Это "задача 3".
Это "задача 1" выше -- поддержка совместимых с чем-то внешним форматов.
Лёгкое причёсывание формата, "задача 4". Тут почти ничего не надо делать, кроме добавления новых полей?
Селектор материалов, "задача 5а"
Алгоритм селекции материалов, "задача 5б".
Индивидуальные патчи, "задача 6". |
Нам не нужно тащить JSON-парсер, нам нужно просто соответствовать JSON-формату формально, перечитай выше тред, там про это было исходно. Обработать лишние
Нужно больше подробностей. Задачу "задача 2б" можно же решить просто по самим путям разбирая их в процессе. То есть уже есть имя файла и этого достаточно чтобы сформировать строки уровня:
Соответствие JSON, переименовка полей, новые поля, всё да.
Ну наибольшая полнота это упорядочить правила по полноте и стопать по первому полному совпадению. |
@w23 там @LifeKILLED предлагает добавить ещё параметры френеля и преломления, можно это ещё пробросить до кучи? Нужно только пробросить реализует в шейдере он сам. |
А что за параметры френеля? |
Эта картинка на отражении - это Френель. Сонаправленность проскости и взгляда усиливает отражение. Для каждого материала он свой. Можно сделать поле в материале, чтобы просто привязывать к каким-то текстурам и потом уже в шейдере разбираться, как его использовать |
Преломление тоже у разных материалов разное. По сути нужны просто поля в материалах, которые будут настраивать дизайнеры. Если будет и то, и то, можно будет делать всё от стекла и до воды. Но также можно еще и добавить какие-то параметры специально для воды, например, масштаб и высоту волн, чтобы она процедурно анимировалась Либо действительно прокинуть func_water для drag'n'drop совместимости с модами, а стекло при этом просто захачить |
А еще помимо френеля (усиление доли отражений) есть еще и аналогичный эффект у прозрачки, это угол полного отражения. Если смотришь на стекло по касательной с определенным углом, оно полностью перестает пропускать через себя свет и превращается в зеркало. Получается 3 переменных у материала.
Что-то такое. По сути просто дополнительные цифры в материале, которые будут использоваться либо в лучах, либо в PBR рендере без лучей, если сделаем и такое |
Я в курсе, что эффект Френеля из себя представляет. Меня волнует, что конкретно там нужно вынести наружу? Ведь я насколько помню в аппроксимации Шлика доступна для модификации только переменная F0 - она обозначает множитель отраженной доли света при нулевом угле между нормалью и вектором направления взгляда. Для воды он равен около 0.1, для других поверхностей типично хардкодят 0.04. Вот про эту штуку речь? |
Да, достаточно F0 |
|
Параметры "for_model_type" и "mode" в материалах не будут использоваться. |
Недостатки текущего формата материалов:
Нам нужен более удобный формат для унификации с PrimeXT, чтобы не мешать им своими заморочками.
Предлагаю немного изменить текущий формат и сделать его JSON-совместимым, по сути всё отличие заключается в наличие двоеточия и запятых в конце. Вложенных структур не планируется, то есть существующий парсер не придётся как-либо ощутимо менять в этом плане.
Но помимо этого вводится ещё понятие самих материалов, которые можно указать внутри блока замены текстуры, с этим сложнее.
Суть сводится к объявлению материалов отдельным блоком:
дальше мы внутри блока замены текстуры указываем этот материал:
Внутри блока с "for" по прежнему будут работать строки с параметрами материалов.
Это по сути просто взятие параметров из блока материалов и вставка их в блок замены текстуры.
Таким образом можно будет переиспользовать одни и те же параметры для разных текстур и где-то переопределить внутри блока "for" параметры из "material", это и так сейчас работает если указывать одинаковые ключи, то возьмётся последний.
Внутри патчей мы можем заменить
"_xvk_texture" "texturename"
на"_xvk_material" "materialname"
.Возможно тут будет проблема у парсера из-за одинакового наименования (я не помню как парсер устроен), если так, то можно внутри блок с "for" использовать
"set_material" "blabla blabla2"
.Минус подхода что придётся держать временную хэшмапу с материалами.
The text was updated successfully, but these errors were encountered: