Попытка собрать всю информацию по созданию самых-самых идеально выглядящих спреев.
Вступление

Этот гайд в целом - теоретический (не "пошаговое руководство"). Идея в том, что его лучше прочесть целиком; это позволит понять, как устроены спреи (хотя бы примерно) и чего от них можно ожидать.

Итак, вот что у нас впереди:

  • Высококачественные спреи(это просто!)
  • Пару слов о сжатии(теория)
  • Прозрачность(теория)
  • Мипмапы(теория)
  • Спреи с анимацией(это тоже просто!)
  • Спреи с «переливачкой»(а вот тут сложнее… и пока лишь поверхностные указания)

Если вам лень и все это не для вас см. в конце статьи.

Высококачественные спреи

Для начала, надо побороться с принудительным изменением размера картинки. Нам таки потребуется  VTFEdit (его можно скачать тут) В его меню – импорт – указываем нашу картинку с разрешением 512х512 – и выскакивает панель, управляющая преобразованием.
Давайте, для начала, поступим «неправильно» - укажем формат без сжатия, первый в списке (General – Normal Format и Alpha Format – тут как правило стоит указывать всегда одинаковый формат в обеих полях) – выберем RGBA8888 (что означает 4 байта на точку). Запишем спрей. Размер файла спрея – 1,4 Мб, почти в три раза больше допустимого. У-уупс! Такой спрей игра не покажет.

А вот теперь - сделаем всё так, как надо:

Закроем VTFEdit, и запустим его заново. Опять пытаемся импортировать нашу картинку. Но на этот раз выберем сжатие DXT5. Еще стоит обратить внимание на вот что: снять галочки с Resize и Generate Normal Maps, а еще лучше включить галочку Generate Mipmaps, и там выбрать Mipmap filter: Box (upd: нет, только не Box: у него в vtfedit кривая реализация, уж лучше Blackman или "Кайзер") и Sharpen filter: none.

Типичные настройки импорта в VTFEdit:
steamworkshop_webupload_previewfile_297118429_preview.png.253f8e7f17bc04168394cab589c05998.png
Кроме того, после импорта, в левой панели стоит взвести два флажка: "anisotropic filtering" и "no level of details". Фактически, это означает "игнорировать настройки детализации игры и показывать спрей всегда с максимальным качеством.

Записываем спрей. Размер файла – 340 кб. Ура! Наш высококачественный спрей готов. Конечно, сжатие DXT5 немного испортило картинку, но выглядит она в своих 512х512 все равно лучше, чем, например, та же картинка в 256х256 без сжатия.

Примеры спреев без- и со сжатием.
imgonline-com-ua-2to1-0p7NVTW2oQB.png.86e86082c17e63a316607e271b77831e.png

Слева: RGBA8888 (т.е., без сжатия), 256х256, размер файла 341 Кб.
Справа: DXT5 (сжатие с потерями), 512х512, размер файла - те же самые 341 Кб.

 

Пару слов о сжатии

  • RGBA8888 – формат без сжатия, каждая точка изображения представлена каналами цвета «RGB» и ещё каналом прозрачности «A» (альфа-канал). Т.е., «8888» - означает по 8 бит на канал. На выходе - 4 байта на точку.
  • RGB888 – как предыдущий, но без прозрачности. Три байта на точку.
  • BGR565 – цветовые каналы малой точности, без прозрачности. Два байта на точку. (В чистом виде не отображается в L4D)
  • DXT5 – точки картинки группируются в блоки 4х4, и цвет точек блоков описывается вместе довольно странным алгоритмом.На выходе ~ 1 байт на точку.
  • DXT1 – почти то же самое, что и DXT5, но без канала прозрачности. На выходе получается ~ ½ байтa на точку.
  • Формат DXT1 с однобитной альфой, увы, не поддерживается игрой (upd: оказалось, поддерживается, но толку с этого мало), и очень жаль, что так. (кажется source engine специально игнорирует все форматы с однобитной прозрачностью) (upd: нет! виноваты кривые руки разрабочиков VTFEdit и vtex)

Остальные форматы рассматривать нет смысла.


А реально используются лишь RGBA8888, DXT5, DXT3 и DXT1.

 

Все форматы DXT ощутимо портят картинку, но выигрыш от увеличения разрешения с лихвой покрывает вред от проступающих дефектов - артефактов сжатия, как вы только что могли заметить по картинке выше.

 

Цифры для сравнения: картинка 512х512 без сжатия – 1 Мб (не годится по размеру для спрея), в DXT5 – 256 Кб, в DXT1 – 128 Кб.

Как же выбрать формат? Коротко говоря, если у нас есть большая картинка (512х512) с прозрачностью – выбираем DXT5, если прозрачности нет – DXT1; ну, а вот если оригинал картинки, из которой мы делаем спрей, размер имеет 256х256 и меньше - RGBA8888.

Сжатие RGB в DXT1..5 работает примерно так: картинка разбивается на квадратики 4х4. Для каждого квадратика выбираются два "крайних" цвета, оба сохраняются в формате RGB565. Из каждой из 16 точек квадрата сохраняются лишь 2 бита - они указывают, насколько далеко текущий цвет отстоит от "крайних" цветов. Т.е., фактически, внутри квадратика может быть только 4 цвета, и то, два их них будут чем-то средним между "крайними". На практике, это приводит к заметным искажениям лишь тогда, когда в одной точке сходятся 3 и более различных "ярких" цвета. В разделе "разное", ниже, есть некоторые дополнительные подробности о dxt-сжатии.

Прозрачность

"Прозрачность" (и полупрозрачность) хранится в отдельном слое "A" (alpha-канал). И, соответственно, занимает место... до 1/4 в режиме без сжатия и до 1/2 второй в режиме со сжатием DXT3 и DXT5.

Необязательное: При создании спрея с прозрачностью хорошей идеей будет оставить вокруг изображения рамку в 1, а лучше 2 прозрачных или почти прозрачных пикселя. В противном случае, учитывая, что интерполяция текстур видеокартой непрерывна, мы увидим на противоположной стороне спрея следы от краевой текстуры - полоску, слабую, но всё-таки различимую.

 

Ещё необязательное: Также неплохой мыслью будет "чистка" невидимого изображения под альфой, а еще лучше - заполнение его пикселями цветов с границы прозрачности-непрозрачности. Такую операцию делает автоматически PhotoShop последних версий; выглядит она как характерные ореолы вокруг цветных объектов с прозрачностью; они видны, если скрыть альфа-канал в VTFEdit (в меню - "маска" вкл/выкл). Эта операция нужна для генерации мипмап лучшего качества, а так же, чтобы из под маски альфа-канала не "вылазили" соседние цвета, что иногда случается на картинках с резкой границей "альфы".

Разница между DXT3 и DXT5 состоит только в способе хранения "альфы". И хотя объем прозрачность занимает одинаковый в обоих случаях, способы ее представления различаются. В случае DXT3 мы имеем дело просто с 4-битной альфой на точку; никакого сжатия не применяется. В DXT5 используется механизм интерполяции, подобный сжатию RGB текстур DXT1 - для каждого элемента изображения 4x4 пикселя выбираются два предельных значения прозрачности, и для каждой точки внутри квадрата указывается относительное расстояние до этих крайних значений. В целом, техника DXT5 даёт более плавные тени, но могут случаться "рваные" края изображения спрея, в некоторых случаях, - и вот тогда на помощь придет DXT3.

Мипмапы

Если взвести галочку "Generate Mipmaps", файл спрея резко начнёт занимать примерно на треть больше места.

Почему? Да потому, что эта галочка позволяет сохранить в теле файла спрея его уменьшенные со сглаживанием копии. Они показываются игре, когда игрок отдаляется от текстуры. Чем дальше точка зрения, тем меньший кадр достается из обоймы и предъявляется усталому взору игрока. Это нужно для того, чтобы картинка в отдалении неприятно не мерцала муаром – который видеокарта просто не может устранить; видеоакселераторы умеют растягивать текстуры, но не умеют уменьшать их. Поэтому уменьшение производится заранее, еще на этапе подготовки любой текстуры в игре.

Что до подготовки мипмап в VTFEdit'е, на мой взгляд, лучший фильтр для мипмапов "Box" с резкостью "none" или "sharpen soft". Дело в том, что алгоритм "Box" создан как раз для уменьшения картинки в кратное число раз, а именно так мипмапы и генерируются: каждая текстурка в них  уменьшенная вдвое копия предыдущей.UPD: Практика показала, что по-настоящему высококачественных алгоритмов изменения размера в составе VTFEdit-а увы, нет. Теперь я обычно пользуюсь для создания мипмап алгоритмом Blackman'а, c резкостью None. В таком случае резкости бывает маловато. Компенсировать этот эффект не выходит. Даже самый слабый алгоритм наведения резкости (sharpen soft) даёт слишком много резкости. Выходом могла бы служить выгрузка текстуры в DDS-формате (как при создании спреев-переливачек), и ручное составление мипмап, но увы, это слишком кропотливая работа, одна из тех, про которую говорят, что "игра не стоит свеч".

 

Нужны ли нам мипмапы? Иногда да, иногда нет. Если мы просто делаем качественный спрей 512х512 – мипмапы нужны, он будет лучше смотреться в игре.
Кроме того, мипмапы используются в создании спреев-переливачек, но об этом дальше.

 

Подробности о назначении мимпап: http://ru.wikipedia.org/wiki/Mipmap

 

Спреи с анимацией

Ничего сложного. Просто отметьте несколько файлов при импорте в VTFEdit – и получите свою анимацию.

Наш главный «враг» - размер файла. Мы можем уменьшить его, применив сжатие (экономия 3/4 размера) и отключив mipmaps (экономия ~⅓ размера файла). Можно избавится и от прозрачности, чтобы получить вполтора раза больше места, если это уместно на конкретной картинке, разумеется. Или уменьшить размер кадра с 512х512 до 256х256 или даже еще ниже.

 

Вот некоторые цифры, полученные опытным путем, они помогут в создании анимации:

Темп анимации – 5 кадров в секунду. Кажется, это число изменить нельзя. (?)

  • Анимация 512х512, сжатие DXT1, без альфы, без мипмап – влазит 3 кадра.
  • Анимация 256х256, сжатие DXT1, без альфы, без мипмап – влазит 15 кадров (3 секунды «видео»).

 

Спреи с "переливачкой"

Вы должно быть видели такие спреи – подходишь к ним ближе, и картинка изменяется.

Как это работает? В мипмапе, во всех её «кадрах», картинка должна быть одна и та же – только разного размера. Но если мы заменим один из кадров – получим именно то, что хотели.

Здесь нам потребуются некоторые специальные утилиты.

  • PhotoShop – мы будем использовать плагин к нему.
  • Nvidia Photoshop Plugin – позволяет Фотошопу записать картинку в формате dds – наш спрей в формате текстуры с мипмапами.
  • Microsoft DirectX SDK – из него используется только утилита DirectX Texture Tool, удобное средство для замены mipmap-ов.
  • VPKTool – конверсия из dds-формата в формат vtf.

Охо-хо! На этом месте мне вдруг стало лениво писать; лучше посмотрите картинки в английском гайде – вот тут - http://tf2.gamebanana.com/tuts/9038 (заметка «Distance Fading Sprays»). Там же есть ссылки на все необходимые утилиты.
 

***
Я позже напишу инструкцию подробную инструкцию, а пока пусть будет черновичок:

Готовим 2 картинки. (Можно больше, но надо учесть, что мипмапы где-то начиная с 4й практически невозможно разглядеть, настолько они мелкие, поэтому смысла мало).
Ресайзим/обрезаем картинки под 512х512.
Загружаем одну из картинок в Фотошоп; тут же выгружаем картинку в формате DDS (с включенными мип-мапами, ессно).
Загружаем это безобразие в DirectX Texture Tool. В нем можно листать мип-мапы клавишами Page Up / Page Down.
Останавливаемся на той картинке, которую мы хотим заменить (как правило, на самой большой).
Заменяем через меню текущую картинку. (Menu - File - Open Onto This Surface...).
Записываем DDS.
Открываем DDS в VPKTool, и записываем его в формате VTF.
Опционально, открываем наш VTF в VTFEdit и доставляем нужные флаги (для улучшения качества, такие как No LoD, Anisotropic, Clamp S, Clamp T), записываем.

 

Всё - «переливачка» готова!

* * *

 

Где-то мне попадался еще другой способ формирования мип-мап; и тот, второй способ мне нравился больше; состав инструментов был почти таким же, но, кажется без directx sdk, а замена картинки производилась прямо в Фотошопе. Но что-то не могу это воспроизвести. Упоминаю я здесь потому, что взялся описывать качественные техпроцессы, так вот, этот способ был менее удобным, но качество на выходе давал лучше, потому что качество сжатия dxt у nvidia-вского плагина выше, чем у тулзы из микрософтовского сдк.

 Всяко разно

Качественная исходная картинка

Даже не знаю, стоит ли писать столь очевидные вещи... но тем не менее: используйте качественный оригинал! Как правило, оригиналы популярных картинок и плакатов легко разыскать "поиском картинок" от Google. Пример. Слева - низкокачественная копия со следами JPEG-сжатия (очень портит плакаты, кстати), справа - высококачественный исходник.

297118429_preview_nope-compare.jpg.7198b5c1d178dbfd06bc907604286c2f.jpg
 

Не забываем взводить “no level of details”

VPKTool не устанавливает флаг “no level of details”, поэтому, если этот флаг нужен, спрей нужно открыть в VTFEdit, и установить его в нём. Картинка при этом не изменяется и не портится. Этот флаг нужен, чтобы показывать спрей с максимальным качеством, даже если игрок снизил разрешение текстур в настройках игры.
Кстати, а вы знаете, что делают игры, когда вы снижаете детализацию текстур в настройках видео-игр? Они просто отбрасывают самые большие из набора мипмапов! Большие мипмапы не загружаются в память; загружаются лишь маленькие мипмапы - это экономит память компьютера и видеокарты.

 

Баги прозрачности в некоторых форматах

Форматы с малой битностью на канал, нечто в роде RGBA4444 и RGB565 (rgb565 вообще не отображается, как оказалось) немного неправильно интерпретируются игрой - цвет не получает полную яркость, а альфа - полную прозрачность. В результате картинка может выглядеть бледновато, и сквозь ее даже непрозрачные элементы видно немного стену под ней.

 

Разные утилиты сжимают текстуры с разным качеством

DXT - формат сжатия с потерями. Т.е., картинка портится при сжатии. Так вот, разные утилиты конвертируют картинку в этот формат с ощутимо разным качеством. Самые лучшие результаты дал... VTFEdit! Кажется, он использует современный движок nVidia c алгоритмом Сквиша (Squish) - фотошоп с нвидие-вским плагином дает результаты точь-в-точь как у него. На втором месте - микрософтовская конвертилка "DirectX Texture Tool" из ихнего SDK. Третье место делят всякие утилиты самодельщиков и хваленная (но устаревшая) nVidia-вская утилита "nvcompress" (2007 г.), показавшая на тестах отвратительные результаты. Неплохо сжимает и гуглевская утилита crunch (2012 г.). А по слухам, самое качественное сжатие собираются выдать японцы, смешивая использование нескольких алгоритмов сразу, и выбирая для каждой из групп точек лучший... Но на попробовать они это чудо не дают, т.к. собираются использовать его в своей новой PlayStation.
Почему я уделяю этому сжатию столько внимания? Да потому, что хочу получить идеальный результат, самый лучший, какой только возможно. ;) Однако, кажется, до идеала ещё далеко.
Примеры сжатия сложного для DXT компрессии изображения:

804222861_steamworkshop_webupload_previewfile_297118429_preview(1).png.c9ad4189f7093a4b6e30318dce22cf8b.png

Подробности о сжатии вы можете узнать здесь: http://www.gamedev.ru/code/articles/DDS_DXT1_DXT3_DXT5

 

Включаем квадратные пиксели

Флажок PointSample в VTFEdit означает "отключить сглаживание текстур". Т.е., когда мы ткнемся носом в спрей с таким флагом, мы увидим не привычную "размазню", а "квадратики", как в старых играх вроде Doom. Иногда этот флажок бывает полезен для спреев низкого разрешения, например, с анимацией.
steamworkshop_webupload_previewfile_297118429_preview.jpg.076c7ed7ebd1f97414e16b1eba10d0bd.jpg 

Здесь использован один и тот же крошечный спрей размером 32х32 пикселя. Строго говоря, у этих спреев даже файлы одинаковы - почти! - они отличаются лишь одним битом, который как раз означает взведенный флажок "Point Sample": слева он выключен, справа - включен.

 

Clamp S, Clamp T

Коротко: взводите эти флажки, если хотите получить спрей максимального качества.

Атрибуты Clamp S, Clamp T меняют режим «стыковки» текстур. При не-взведенных флажках работает режим «заполнение» («повторение)». При взведенных флажках (я пока не знаю, какой за что отвечает, поэтому ставлю оба), всё пространство за пределами текстуры будет заполнено (виртуально) ее последними пикселами с краёв. Это сильнее всего нужно на сервере (в картостороение), где можно указать масштабирование/поворот большой текстуры с прозрачностью по краям. Но даже для спреев эти атрибуты стоит взводить - именно они отвечают за то, чтобы с противоположного края текстуры не «протекали» цвета. (Извините, не могу это лучше сформулировать... рекомендую просто погуглить картинки про энтот самый «Кламп», например из гайда по OpenGL, и глядя на них, вы все поймете).

 

Пару слов о VTF

Вообще, vtf-формат, как я его понимаю, это контейнер в котором лежит одна или несколько dds-текстур и кое-какие дополнительные флаги. А vmt - какое-то дополнительное описание, и, поскольку мы в конечном итоге втаскиваем vtf-спрей не заменой файла, а открываем его в игре, vmt не нужен.

 

Превьюшки спреев в Проводнике

Плагин к Винде "VTF Shell Extensions" позволяет видеть превьюшки спреев в каталогах файлов, что бывает весьма полезно.

sprays.png.4102305b1eb8477efdc9611b0c7294fe.png

Скачать его можно здесь

 

Для ленивых
Просто загрузите свой рисунок на онлайн-сервис https://sprays.tk/ выберите какой-нить хороший "Texture format", нажмите "Conver" и "Save as VTF".
Он сам подгонит ваш рисунок под нужный размер и сделает максимально качественный спрей.
Поддерживаются спреи и с альфа-каналом, а так же gif-ки до четырёх кадров.

 

P.S:  Это моя первая публикация не судите строго. Автор не я, я просто нагло слизал адаптировал под форум. Добавил что-то свое, вырезал лишнее (возможно даже важное) Надеюсь это руководство поможет вам так же как мне.
Ссылка на источник(оригинал):https://steamcommunity.com/sharedfiles/filedetails/?id=297118429

Поделиться сообщением


Ссылка на сообщение

Возможно, подобная тема уже и была где-то на форуме, но за старание лайк. Молоток! :yes:

Поделиться сообщением


Ссылка на сообщение

Классная статья, спасибо)) помогло)

Поделиться сообщением


Ссылка на сообщение

Увидел спрей у "старого". Довольно чёткий. При том что его размер был 1020х1024 и не превышал 512 кб.

Пробовал ужимать с помощью vtfedit большие спреи 1024х1024, чтоб уложится в 512 кб, но к сожалению нечего не вышло. Оказывается есть давно уже сайт который может урезать изображение в 1020х1024 при 510-11 кб, что влазит в лимит.

Поэтому долой спреи 512х512, потому что 1020х1024 выглядят куда сочнее. 

https://rafradek.github.io/Mishcatt/

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас