Статьи по работе с текстурами под движком Gold Source (игры Half-Life 1 и Quake 1 и 2)
Работа с текстурами к игре
19.06.2010
Как правило текстуры объединяют в большие файлы текстур для увеличения скорости загрузки, и игра Half-Life в этом не исключение.
В Half-Life, как и в некоторых других, используются файлы *.wad для объединения текстур в сборники.
С этим форматом Wad3 и текстурами удобно работать в редакторе Wally (ссылка на нашу русификацию Wally 1.55B ). В нём можно как создать новую текстуру и новый Wad (меню File->New или Файл->Создать),
так и наполнять текстурами Wad и удалять лишние, а также объединять Wad файлы (меню Wizard->WAD Merge или Мастер->Объединение WAD-файлов).
Правда есть одна программа для автоматического прореживания текстур в Wad, которая оставляет только те текстуры, которые встречаются на заданных .bsp картах. Но об этом в самом конце.
Чтобы быстро просматривать текстуры, нужен подходящий просмотрщик. Как альтернативу Wally предлагаю просмотрщик wad-ников Irfan view , который пролистывает их как
многостраничные графические файлы кнопками Ctrl + Page Down или Ctrl + Page Up. Если wad-файл небольшой, то просматривать годится, а когда счёт идёт на сотни текстур, то устаёшь листать и включаешь для просмотра тот же Wally.
А здесь хорошая статья от Mitoh-а из Shambler team про работу с текстурами в Half-Life "Всё о текстурах". Но, конечно, далеко не всё, хотя и не мало.
А теперь вот что посоветую при работе с текстурами, товарищи разработчики (и не только проекта Half-Life Red Alert mod, но и многих других), особенно когда проекты становятся большими,
а текстуры многочисленными:
1а) Создать сборник текстур для локализации, чтобы было проще выпускать патчи для игроков с другими языками.
Все текстуры, требующие перевода на другие языки вроде надписей в секретках "Map by Roofman", особенно которые необходимы для лучшего понимания сюжета игроками были перенесены в файл localization.wad
1б) Тогда нужно сказать и про все остальные wad-файлы в корневой папке мода. После объединения текстурных wad-файлов в проекте их осталось только четыре:
decals.wad — текстуры декалей,
localization.wad — текстуры с надписями, которые можно переводить для локализации,
ralert.wad — все рабочие текстуры. Этот объединённый файл исключает дублирование текстур (именно это часто мешало) и меньше загружает работой диск компьютера в игре, чем десяток в прошлом у проекта ХЛРА.
И, наконец, в файловом хозяйстве стало компактнее за счёт того, что легче разбираться в папке мода с файлами.
zhlt2.wad — текстуры для служебного использования типа null или 000grid (подробнее о наших спецтекстурах будет дальше)
Пока такой расклад с файлами работает оптимально. Из остальных нетекстурных wad-ников остались:
cached.wad — conback.bmp фон в консоли орисовывается 3d движком и должен быть загружен как текстура, а также loading.bmp вместо Фримена со словом лоадинг
gfx.wad — картинка "Loading" и консоли backtile.bmp, conchars.bmp, creditsfont.bmp, lambda.bmp, lambda32.bmp, lambda64.bmp и paused.bmp
pldecal.wad — аэрозольные эмблемки
У нас сделана пара вариантов эмблемки бетатестера для pldecal.wad, которой вы можете отмечать ;) требующие исправления участки: полупрозрачный оранжевый знак
pldecal.wad и — pldecal.wad с цветным знаком.
Кстати, как будет по-татарски "сделай лучше!" ?
2) В распакованном виде перебирать текстуры удобнее. Потому готовые текстуры лучше хранить в
каталогах в обычных графических форматах *.jpg или *.png кроме текстурных сборников в игру (wad-файлов в нашем случае).
Иногда при сохранении в jpg заметно теряется качество, потому лучше
использовать с 256-ти цветной палитрой графический формат png. Если количество текстур превышает
несколько десятков, то в каталогах текстуры нужно рассортировать по категориям, и тогда в большом
объёме любая текстура найдётся в разы скорее. Когда в соответствии с идеей Mig-29 я сделал такую сортировку , то чтобы затекстурить карту,
текстура находится за секунды вместо подбора каждой по 3-5 минут. Основные категории текстур (названия каталогов) предлагаю такими:
Decal
Биофигни
Выключатели
Двери и ворота
Деревянные
Деревья и сосульки
ЖД и метро
Жидкости
Забор
Знаки и таблички
Крыша шифер и др.
Лестницы
Мебель книжки и документы
Мелочь однотонная
Металл
Окна
Пол
Потолок
Приборы и экраны
Провода и трубы
Решётки и вентилляция
Светильники
Служебные
Снег
Стекло
Стены
Тара ящики контейнеры бочки
Транспорт
Фон
Если текстура подходит одновременно в две или больше категорий, то копирую и туда и туда, чтобы быстрее выбирать и не мотаться между категориями.
3) В Half-Life последний цветовой индекс в 256-ти цветной палитре используется для обозначения прозрачности в точках текстуры, закрашенных этим цветом
в режиме отображения "Solid" (у брашевой энтити в параметре Render Mode выбирается значение Solid, а в параметре
Fx Amount = 255 задаётся максимальная степень непрозрачности остального изображения на текстуре).
Иногда нужно создать энтитю из брашей, окрашенных в несколько текстур, одна-две из которых требуют
такой прозрачности, а остальные должны остаться сплошными текстурами, т.к. на них не должно быть
дыр, короче, выглядеть как обычные текстуры.
Потому даже если ваши текстуры не требуют прозрачности, заранее делайте текстуры
255-и цветными, а не 256-ти цветными, оставляя последний цвет в резерве, чтобы сложные
кострукции было быстрее переводить в режим отображения Solid.
Заодно избежите случайных ошибок вроде ящиков в непонятных дырах. Спотыкался я об такие в деме...
Тогда случайно выставили режим Solid, а если бы текстура была 255-ти цветной, то можно было бы не исправлять.
Да, обычно текстуры с прозрачностью имеют приставку {. Например, текстура {havchik :
,
но все остальные текстуры так же могут быть использованы в режиме с прозрачностью.
Кстати, никто не пробовал эффекты в этом режиме со значениями Fx Amount в середине диапазона между 0 и 255? Можно сделать цветные стёкла на экранчиках приборов, будет реалистичней.
255-ти цветные палитры вместо 256 цветных — это удобно, но изредка многоцветным текстурам требуется больше цветов при переводе в 8-битную палитру, и я
всё-таки делаю палитру на все 256 цветов, и то мало помогает. Можно попробовать диффузное размывание при уменьшении количества цветов палитры.
Окна на больших зданиях часто для экономии ресурсов делают плоской текстурой, причём Half-Life 2 тут тоже не оригинальна. А мы пойдём другим путём и сделаем окна объёмными с помощью эффекта альфа-канала:
Очевидно, это достигается с помощью комбинации двух текстур, в одной из которых последний цвет в палитре задаётся прозрачным. Короче,
в редакторе такой бутерброд:
(только полупрозрачность текстуры на переднем плане сделана позже для наглядности с помощью наложения в графическом редакторе).
Текстуры {bld_front108 и bld_front108.png сделаны в виде покрытых морозными узорами окон в кирпичной кладке:
Скачать полный 7z-архив из 6 текстур можно по этой ссылке.
В {bld_front108 последний цвет палитры окрашен не традиционным синим, а светло-серо-коричневым, потому что край прозрачных областей
при отрисовке текстур с альфа-каналом в игре окрашивается тонкой каймой цвета для альфа-канала. Тут по периметру окна синяя каёмка будет мешаться, а серо-коричневый — наоборот
теряться рядом с кирпичной кладкой.
4) 3 и 4 идексы палитры у текстуры жидкости в Half-Life используются для обозначения цвета мути и
степени мутности. Как известно, текстура жидкости всегда имеет приставку !.
Между прочим во всех остальных файлах, кроме текстур, приставка к файлу ! в проекте Red Alert означает, что
файл устарел или зачем-нибудь переведён в резерв, а вместо него уже есть рабочий файл без восклицательного
знака.
А в 4-м индексе цвета текстуры жидкости за степень мутности отвечает красная составляющая (меньше значение — слабее муть).
Для чего зарезервированы зелёная и синяя составляющие — остаётся только догадываться, но думаю, что зелёная — для коэффициента преломления, а синяя —
для коэффициента рассеивания (или светорассеяния, из-за которого уменьшается резкость и появляются ореолы).
5) Чтобы закольцевать текстуру по вертикали и горизонтали, можно использовать графический редактор Gimp. В меню Фильтры->Карта->Без швов вызывается эффект переналожения краёв друг на друга, чтобы можно было одной текстурой неоднократно замостить поверхность и получить всю картинку без стыков. А для более сложных случаев, как обычно,
приходится использовать инструмент Штамп:
Gimp
(на текущий сентябрь 2013 года версии 2.8.10) теперь достаточно мощный графический редактор, в том смысле, что многое умеет,
к тому же бесплатный, русифицированный, и вообще многоязычный, есть под ОС *nix, Windows и MacOS,
а с 2.8 версии наконец можно включить однооконный режим,
а то в Windows инструментальные панели располагались не достаточно удобно.
Ещё в Gimp пригождается для имитации экранчиков со строками эффект закрашивания каждой чётной строки (можно нечётной)
В меню Фильтры->Искажения->Очистить каждую вторую строку
6) В проекте задействованы ещё три специальные текстуры 000grid, aaabiggrid и aaametr.
000grid с изображением с квадратов 64x64 в начале была задумана как копия квадратов координатной сетки в Hammer-е, т.к. после загрузки редактора сетка там сначала 64х64. И использовалось это для измерения расстояния слышимости звуков, если расчертить этими квадратами, например, плоскость пола в обычном масштабе 1:1.
Но затем ей стало удобно затекстуривать служебные объекты и карты, т.к. её название идёт первым в списке текстур. Это напоминает оранжевые карты Half-Life 2, когда они не затекстурены,
только у этой тёмно-серой текстуры есть некоторое преимущество — на карте сразу можно выделить другой яркой текстурой места, на которые следует обратить внимание.
aaaBiggid с изображением квадрата 512x512 для измерения протяжённых расстояний на карте.
aaametr с изображением квадратов 40x40 используется для измерения в метрах. Считается, что метру соответсвуют 40 условных единиц расстояния в игровом пространстве aka unit-ов. Точнее 1 у.е. — это практически дюйм, но для удобства примем, что 40 у.е. = 1 м. Накладывая текстуру 1:1, можно измерять расстояния.
Эти 3 текстуры можно скачать в файле zhlt2.wad [19 кб в zip].
Есть известная текстура aaatrigger с изображением "эмо-лямбды"
, которой для удобства затекстуривают поверхности
невидимых брашевых объектов — в первую очередь объёмных триггеров и во-вторую непроходимых двигающихся объектов, напоминаю, невидимых, хотя если найдёте к чему ещё пристроить...
Но бывает так, что многогранники триггеров скучены в одном месте, и тогда для различения мы накладываем на часть триггеров ещё более незатейливую текстуру red
. Этой же текстурой красятся триггеры, на которые следует обращать повышенное внимание.
Во время создания первой демки традицию использования aaatrigger для триггеров не поддерживали, использовались текстуры какие случалось.
Один раз Руф покрасил несколько триггеров на первой карте мода светящейся текстурой ~spotblue, и когда после нескольких изменений карты я не обратил на это внимание
и скомпилировал, то получил загадочное освещение от невидимого синего объекта:
Необычная ошибка, но где-то можно задействовать и такое.
Удаление незадействованных текстур
Теперь про порядок в текстурах: когда ваш проект завершён (особенно мод на много карт, с одной картой можно при компиляции встроить текстуры в файл bsp),
нужно как-то удалить незадействвованные текстуры, которых бывает очень много. При выпуске первой демоверсии HLRA для того, чтобы подчистить wad-файлы, Дзугару и Руфмену
пришлось выписать названия текстур в тетрадь, и долго сверять, какие из текстур остаются.
Теперь для bsp формата карт Half-Life и сборников текстур типа wad3 тов. XaeroX cоздал утилиту WadClean,
которая удаляет незадействованные в bsp картах текстуры из wad.
Для этого нужно скопировать wad-файлы и bsp карты вашего проекта в одну папку с утилитой,
а в командной строке задать названия ваших карт через пробел:
wadclean [-d] karta1.bsp [karta2.bsp ...]
После её работы создадутся wad-ы, которые станут содержать только задействованные в картах текстуры,
а оригиналы wad-файлов сменят расширение c .wad на .bak (сокращённо от back, что в переводе сами знаете, что значит).
Правда есть одно исключение — файл decals.wad утилита не тронет.
Необязательный параметр -d создаёт текстовый файл со списком удалённых текстур. Скачать WadClean
можно в разделе Инструменты.
Уменьшенные подтекстуры
Подтекстуры или MIP-текстуры — это дополнительные к исходной текстуре
текстуры, уменьшенные в кратное двум число раз (теперь догадываетесь, почему размер текстуры кратен 16?).
Они используются на дальних расстояниях, когда снижается детализация, чтобы уменьшить объём памяти, используемый для текстур.
В движке GoldSource для каждой текстуры используются три подтекстуры в масштабе 1 к 2, 1 к 4 и 1 к 8.
MIP сокращено от крылатого латинского выражения "multum in parvo", которое означает "кратко, но содержательно",
или если совсем буквально, пусть и не литературно, то "многое в малом".
Эти подтекстуры в редакторе Wally автоматически создаются или обновляются,
когда вставляются в архив wad или pak.
Во время рисования они не всегда показываются пользователю. Чтобы их видеть, в меню Wally
нужно выбрать View->Show Sub-Mips (Вид->Показать MIP-подтекстуры) Ctrl+Shift+S или включить кнопку на общей панели
.
Их можно обновить принудительно, нажав клавишу F11 или в меню Wally Edit->ReMip (Правка->Перестроить MIP-подтекстуры)
или опять же кнопку на панели инструментов рисования
.
Можно управлять алгоритмами сглаживания и повышения чёткости текстур при уменьшении.
Для этого надо зайти в окно общих настроек из меню View->Options... (Вид->Параметры Wally...) или кнопкой на общей панели
.
В окне Настроек есть вкладка ReMIP-перестроение подтекстур, там можете выбрать параметры
метода диффузного сглаживания, степень резкости, которая повышается после сглаживания, и когда всё это перерисовывать.
Резкость повышают для большей красоты, так как во многих случаях уменьшенное выглядеть начинает лучше.
Когда идёт работа с текстурой, в которой используются области прозрачности (тот самый альфа-канал на последнем индексе
палитры), сглаживание как правило мешает, и потому его отключают:
Текстура {snow_wire | уменьшено по ширине и по высоте | расстояние отрисовки* |
| исходный размер | 0 – 900 |
| в 2 раза | 900 – 2150 |
| в 4 раза | 2150 – 3650 |
| в 8 раз | 3650 – ∞ |
* — это примерные расстояния отрисовки подтекстур, которые приведены для текстуры, наложенной на поверхность с масштабом 1x1 или меньше. А для мастшаба 2х2 смена будет в 2 раза дальше и т.д.
В этом примере наименьшая картинка выглядит неважно и сейчас и в игре. Теоретически любую из подтекстур можно перерисовать
и вставить в редактируюмую текстуру, но на практике в бетаверсии редактора Wally 1.55B это недоделано. Редактор замечает, что вставляемая
текстура подходит по размеру к одной из подтекстур и спрашивает перед вставкой
"Would you like to paste into the main texture (YES) or into the sub-MIP whose size matches the data on the clipboard (NO)?",
и на отрицательный ответ вопреки обещаниям ничего не перерисовывает.
Вроде был какой-то метод. Если он так и не отыщется, а кому-то очень нужно,
я мог бы набросать небольшой конвертор для работы с одной текстурой.
Александр Пасяда
|