У даній статті я хочу розглянути переваги та недоліки формату DDS, а також утиліти для швидкої і ефективної роботи з ним.
Працюючи над ігровим проектом, ми зіткнулися з проблемою оптимізації ресурсів і, зокрема, текстур. Спочатку ми використовували формат TGA, але згодом перейшли до DDS, так як він опинився болем зручний.
Інструментарій nVidia DDS Utilities можна завантажити з сайту developer.nvidia.com, також він входить в nVidia SDK. До складу nVidia DDS Utilities входять утиліти для роботи з командного рядка: detach.exe, nvdxt.exe, readdxt.exe, stitch.exe і приклад по використанню бібліотеки для компресії текстур.
nvDXT.exe - перетворення з форматів .tga. bmp. gif. ppm. jpg. tif. cel. dds. png і .psd в формат DDS із завданням ряду параметрів для збереження. Є найбільш складною і функціональної утилітою з цього набору.
readDXT.exe - перетворення стисненого зображення в TGA.
stitch.exe - запаковування mipmap рівнів в один файл.
detach.exe - витяг mipmap рівнів з файлу.
-profile <имя_профиля> - зчитує профіль створений з плагіна для Photoshop.
-quick - використовувати швидкий метод компресії.
-prescale <целое_число> <целое_число> - масштабування зображення в заданий розмір.
-rescale
-rel_scale <десятичное_число, десятичное_число> - масштабування зображення. Параметр повинен бути в діапазоні (0.0, 1.0).
Розширені можливості пошуку фільтрування. За замовчуванням: Cubic.
-RescalePoint
-RescaleBox
-RescaleTriangle
-RescaleQuadratic
-RescaleCubic
-RescaleCatrom
-RescaleMitchell
-RescaleGaussian
-RescaleSinc
-RescaleBessel
-RescaleHanning
-RescaleHamming
-RescaleBlackman
-RescaleKaiser
-RescalePoint
-RescaleBox
-RescaleTriangle
-RescaleQuadratic
-RescaleCubic
-RescaleCatrom
-RescaleMitchell
-RescaleGaussian
-RescaleSinc
-RescaleBessel
-RescaleHanning
-RescaleHamming
-RescaleBlackman
-RescaleKaiser
-nomipmap - НЕ генерувати mipmap рівні
-nmips <целое_число> - кількість mipmap рівнів
-rgbe - зображення в RGBE форматі
-pause - при помилці почекати події клавіатури.
-flip - перевернути зображення зверху вниз
-list <имя_файла> - список файлів для перетворення
-list <имя_файла> - перетворити все зображення в поточному каталозі
-outdir <каталог> - каталог для приміщення перетворених файлів
-overwrite - якщо вихідний файл у форматі DDS, то перезаписати замість старого
-binaryalpha - рахувати кожен Тексель альфа текстури або прозорим або непрозорим
-24
-32
Формат текстури. За замовчуванням: DXT3.
-dxt1c - DXT1 (без альфа-каналу [RGB DXT 1])
-dxt1a - RGBA DXT1 (однобітний альфа-канал)
-dxt3 - RGBA DXT3
-dxt5 - RGBA DXT5
-u1555 - нестислий формат 1: 5: 5: 5
-u4444 - нестислий формат 4: 4: 4: 4
-u565 - нестислий формат 5: 6: 5
-u8888 - нестислий формат 8: 8: 8: 8
-u888 - нестислий формат 0: 8: 8: 8
-u555 - нестислий формат 0: 5: 5: 5
-p8 - нестислий палітровий формат 8 біт (256 кольорів)
-p4 - нестислий палітровий формат 4 біт (16 кольорів)
-a8 - використовувати 8 біт альфа-канал
nvdxt -cubemap cubemap.dds -list cubemapfile.lst
Створити кубічну карту з ім'ям cubemap.dds з файлів, описаних в cubemapfile.lst
nvdxt -file test.tga -dxt1c
nvdxt -file * .tga
Перетворити всі файли з розширенням .tga (файли знаходяться в одному каталозі з програмою)
nvdxt -file c: \ temp \ *. tga
nvdxt -file temp \ *. tga
nvdxt -file normal_map.tga -norm
nvdxt -all -dxt3 -gamma -outdir. \ dds_dir -time
nvdxt -file * .tga -scale 0.5
Використання readDXT
В результаті отримаємо один або кілька TGA файлів.
Використання stitch
Відбувається запаковування mipmap рівнів в один файл з файлів tex_00.dds, tex_01.dds, tex_02.dds, tex_03.dds, tex_04.dds, ... і т.д.
Використання detach
Витягуємо всі mipmap рівні з файлу.
Невеликий приклад автоматизації
Приклад з особистого досвіду як спростити роботу собі і іншим. Ефективний при роботі з великим об'ємом однотипних даних. Створюємо звичайний текстовий документ c розширенням .bat і пишемо там наступне:
Ми написали пакетну програму, яка конвертує всі файли формату tga в формат DDS RGB DXT1, видаляє вихідні файли і видає відомості про помилки. Даний спосіб зручний тим, що він не вимагає компіляції і його легко може підлаштувати під конкретну задачу художник або складальник ресурсів.
Післямова, або те, який формат вибрати.
При стисненні RGB текстур найбільш підходящим і дає хороший коефіцієнт стиснення є RGB DXT1. Для стиснення RGBA зображень, в яких використовується альфа канал в якості маски - RGBA DXT1. Якщо для альфа-каналу характерні сильні зміни, рекомендується використовувати RGBA DXT3, в іншому випадку RGBA DXT5. Настійно рекомендую спробувати стиснути текстуру різними форматами для вибору найбільш якісного зображення. Деякі текстури необхідно перетворити в стислому вигляді - текстури, де є плавні переходи кольору або критичні до якості зображення (наприклад, графічний інтерфейс користувача).
Буду радий вислухати відгуки та пропозиції.
Плагін 3ds max для роботи з .dds (тільки для 3ds max 3, 4, 5, тому що в новий версіях підтримка реалізована розробниками).
Adobe Photoshop Plug-ins - два плагіна (Texture Compression Plug-In і Normal Map Filter) і кілька корисних скриптів для Adobe Photoshop, також їх можна використовувати в Jasc Paint Shop Pro.