SteamDB

Спреи

Спреи


Вступление



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





Зачем нужны внешние утилиты?



Обычно новички используют встроенную в саму игру возможность использовать свою картинку в качестве спрея. Однако игра делает это дело скверно. Не верите? Взгляните на пример, увеличив его кликом:СпреиИсходное изображение одно и то же; но слева - то, во что превращает его сама игра, а справа - наш качественный спрей.Если вы не видите особой разницы в качестве, то может быть, вам и не нужен этот гайд? )Для начала, попытаемся понять, что делает TF2 с нашими картинками. Создадим тестовую картинку без прозрачности размером 512х512 пикселей, и "скормим" её игре. После этого поищем свежий файл spray.vtf в каталоге Steam'а. Нашли? Окей... Его размер около 40 кб; откроем его в утилите VTFEdit. Смотрим, что написано во вкладке «info». А написано там такое – тип сжатия DXT1, размер 256х256 пикселей. То есть, игра мало того, что уменьшила размер картинки, так еще и отчасти испортила её специфическим текстурным сжатием. Теперь подсунем игре картинку в формате tga, с прозрачными областями. Повторяем процедуру, и видим, что используется сжатие DXT5, размер картинки 256х256, размер файла 87 кб.Как мы можем улучшить картинку? Да просто увеличим ее разрешение! Теоретически, мы можем использовать любое разрешение, вплоть до 4096х4096, но на практике мы ограничены размером файла. Слишком большие файлы игра попросту не отобразит. (И это к лучшему. Я с ужасом представляю себе загрузку гигантских много-мегабайтных спреев, если бы они были разрешены, и какую нагрузку бы это создавало серверу…) Что до практики - путем проб и ошибок легко можно выяснить, что разрешенный размер спрея < 500 кб. Вот и попытаемся использовать этот размер «на всю катушку»!





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



Для начала, надо побороться с принудительным изменением размера картинки. Нам таки потребуется уже упомянутый VTFEdit (его можно скачать здесь[nemesis.thewavelength.net]). В его меню – импорт – указываем нашу картинку с разрешением 512х512 – и выскакивает панель, управляющая преобразованием (это как раз то, что скрыто от нас в игре).Давайте, для начала, поступим «неправильно» - укажем формат без сжатия, первый в списке (General – Normal Format и Alpha Format – тут как правило стоит указывать всегда одинаковый формат в обеих полях) – выберем RGBA8888 (что означает 4 байта на точку). Запишем спрей. Размер файла спрея – 1,4 Мб, почти в три раза больше допустимого. У-уупс! Такой спрей игра не покажет.А вот теперь - сделаем всё так, как надо:Закроем VTFEdit, и запустим его заново. Опять пытаемся импортировать нашу картинку. Но на этот раз выберем сжатие DXT5. Еще стоит обратить внимание на вот что: снять галочки с Resize и Generate Normal Maps, а еще лучше включить галочку Generate Mipmaps, и там выбрать Mipmap filter: Box и Sharpen filter: none.Типичные настройки импорта в VTFEdit:СпреиКроме того, после импорта, в левой панели стоит взвести два флажка: "anisotropic filtering" и "no level of details". Фактически, это означает "игнорировать настройки детализации игры и показывать спрей всегда с максимальным качеством.Записываем спрей. Размер файла – 340 кб. Ура! Наш высококачественный спрей готов. Конечно, сжатие DXT5 немного испортило картинку, но выглядит она в своих 512х512 все равно лучше, чем, например, та же картинка в 256х256 без сжатия.Примеры спреев без- и со сжатием. Кликните для увеличения:СпреиСлева: RGBA8888 (т.е., без сжатия), 256х256, размер файла 341 Кб.Справа: DXT5 (сжатие с потерями), 512х512, размер файла - те же самые 341 Кб.





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



  • RGBA8888 – формат без сжатия, каждая точка изображения представлена каналами цвета «RGB» и ещё каналом прозрачности «A» (альфа-канал). Т.е., «8888» - означает по 8 бит на канал. На выходе - 4 байта на точку.
  • RGB888 – как предыдущий, но без прозрачности. Три байта на точку.
  • BGR565 – цветовые каналы малой точности, без прозрачности. Два байта на точку. (В чистом виде не отображается в TF2)
  • DXT5 – точки картинки группируются в блоки 4х4, и цвет точек блоков описывается вместе довольно странным алгоритмом. На выходе ~ 1 байт на точку.
  • DXT1 – почти то же самое, что и DXT5, но без канала прозрачности. На выходе получается ~ ? байтa на точку.
  • Формат DXT1 с однобитной альфой, увы, не поддерживается игрой (?), и очень жаль, что так. (upd: кажется, source engine специально игнорирует все форматы с однобитной прозрачностью).
Остальные форматы рассматривать нет смысла.А реально используются лишь 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" c резкостью "none" или "sharpen soft". Дело в том, что алгоритм "Box" создан как раз для уменьшения картинки в кратное число раз, а именно так мипмапы и генерируются: каждая текстурка в них – уменьшенная вдвое копия предыдущей.Нужны ли нам мипмапы? Иногда да, иногда нет. Если мы просто делаем качественный спрей 512х512 – мипмапы нужны, он будет лучше смотреться в игре. Но мы можем сделать ловкий «ход конём», отключить мипмапы (и не использовать прозрачность) - а это позволит засунуть в спрей изображение уже размером не 512х512, а 1024х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»). Там же есть ссылки на все необходимые утилиты.(Я позже напишу инструкцию здесь, но пока её нет...)





Всяко разно



VPKTool не устанавливает флаг “no level of details”, поэтому, если этот флаг нужен, спрей нужно открыть в VTFEdit, и установить его в нём. Картинка при этом не изменяется и не портится. Этот флаг нужен, чтобы показывать спрей с максимальным качеством, даже если игрок снизил разрешение текстур в настройках игры.Кстати, а вы знаете, что делают игры, когда вы снижаете детализацию текстур в настройках видео-игр? Они просто отбрасывают самые большие из набора мипмапов! Большие мипмапы не загружаются в память; загружаются лишь маленькие мипмапы - это экономит память компьютера и видеокарты.Картинка для спрея может иметь любой размер, важно лишь, чтобы итоговый размер файла не превышал 500 Кб, а каждая из сторон была кратна степени двойки, т.е., 64, 128, 256, 512, 1024 и т.д. Однако, в игре спрайт спрея все равно будет растянут до формы квадрата; а прямоугольник можно отобразить только используя альфа-канал, прозрачность. Но мы можем использовать уже упомянутый размер 1024х512 (или 512х1024) чтобы увеличить разрешение хотя бы по одной из сторон, и качество картинки в целом - тоже. Есть и некоторые "глюки" - иногда игра всё-таки показывает не-равносторонний спрей как прямоугольник, а не квадрат, но это происходит лишь на старых видеокартах в низкой детализации, да и то редко upd: как оказалось, это происходит при настройке в опциях видео... "multicore rendering" : OFF, т.е., шанс показать "неправильный" спрей выше, чем представлялось вначале, и, возможно, стоит действительно ограничиться 512х512. Пример отображения сильно-не-равностороннего (4096х128) спрея с разными настройками:СпреиФорматы с малой битностью на канал, нечто в роде RGBA4444 и RGB565 (rgb565 вообще не отображается, как оказалось) немного неправильно интерпретируются игрой - цвет не получает полную яркость, а альфа - полную прозрачность. В результате картинка может выглядеть бледновато, и сквозь ее даже непрозрачные элементы видно немного стену под ней.DXT - формат сжатия с потерями. Т.е., картинка портится при сжатии. Так вот, разные утилиты конвертируют картинку в этот формат с ощутимо разным качеством. Самые лучшие результаты дал... VTFEdit! Кажется, он использует современный движок nVidia c алгоритмом Сквиша (Squish) - фотошоп с нвидие-вским плагином дает результаты точь-в-точь как у него. На втором месте - микрософтовская конвертилка "DirectX Texture Tool" из ихнего SDK. Третье место делят всякие утилиты самодельщиков и хваленная (но устаревшая) nVidia-вская утилита "nvcompress" (2007 г.), показавшая на тестах отвратительные результаты. Неплохо сжимает и гуглевская утилита crunch (2012 г.). А по слухам, самое качественное сжатие собираются выдать японцы, смешивая использование нескольких алгоритмов сразу, и выбирая для каждой из групп точек лучший... Но на попробовать они это чудо не дают, т.к. собираются использовать его в своей новой PlayStation.Почему я уделяю этому сжатию столько внимания? Да потому, что хочу получить идеальный результат, самый лучший, какой только возможно. ;) Однако, кажется, до идеала ещё далеко. Примеры сжатия сложного для DXT компрессии изображения, кликните для увеличения:СпреиПодробности о сжатии вы можете узнать здесь: http://www.gamedev.ru/code/articles/DDS_DXT1_DXT3_DXT5Флажок PointSample в VTFEdit означает "отключить сглаживание текстур". Т.е., когда мы ткнемся носом в спрей с таким флагом, мы увидим не привычную "размазню", а "квадратики", как в старых играх вроде Doom. Иногда этот флажок бывает полезен для спреев низкого разрешения, например, с анимацией.Пример - кликните для увеличения:СпреиЗдесь использован один и тот же крошечный спрей размером 32х32 пикселя. Строго говоря, у этих спреев даже файлы одинаковы - почти! - они отличаются лишь одним битом, который как раз означает взведенный флажок "Point Sample": слева он выключен, справа - включен.Вообще, vtf-формат, как я его понимаю, это контейнер в котором лежит одна или несколько dds-текстур и кое-какие дополнительные флаги. А vmt - какое-то дополнительное описание, и, поскольку мы в конечном итоге втаскиваем vtf-спрей не заменой файла, а открываем его в игре, vmt не нужен.Плагин к Винде "VTF Shell Extensions" позволяет видеть превьюшки спреев в каталогах файлов, что бывает весьма полезно.СпреиСкачать его можно тут: https://developer.valvesoftware.com/wiki/VTF_Shell_Extensions Быстрый способ сделать спрей из комикса или карикатуры:http://steamcommunity.com/sharedfiles/filedetails/?id=317550128





Неудачные опыты



Неудачей закончился опыт с YCoCg-компрессией. Идея такова - используется DXT5, но для непрозрачных картинок. Канал прозрачности замещается, грубо говоря, дополнительным каналом цвета. Результат - практически полное отсутствие артефактов сжатия. Такие DDS текстуры умеет записывать специальный плагин к Gimp'у. Однако, преобразовать в VTF этот DDS не получилось. TF2 не смог воспроизвести текстуру. Может быть, есть какой-то способ подсунуть такие файлы игре, а может, движок TF2 совсем не поддерживает текстуры такого типа.Также неудачно завершился эксперимент по созданию 1024х512 текстуры с мипмапами. Идея была записывать dds-текстуру с мипмамами, но не с полным набором, а скажем лишь с двумя-тремя. Это позволило бы втиснутся в ограничение на размер файла, несколько улучшив качество спрея вдалеке, и также - создать качественный спрей-"переливачку". И отчасти идея даже сработала... спрей загрузился в игру, но... Но, во-первых, VPKTool криво его сконвертировал, с каким-то мусором сверху. Во-вторых, в игре показывались мои мип-мапы (да, с "мусором"), но кроме них, почему-то вылазили и дополнительные, содержащие уже полную мешанину пикселей. Может быть, Valve не понимает формат с ограниченным к-вом мипмап?Теоретически возможно создать анимированную "переливачку". Но... как? Ни одна из утилит, которыми я располагаю, не позволяет упаковать анимацию из нескольких кадров dds напрямую в vtf...



скачать dle 10.6фильмы бесплатно