Morrowind:Инструкция от Qwertiss по работе с TES 3: Construction Set - часть 3

Материал из Tiarum
Перейти к: навигация, поиск
Инструкции по работе с TES 3: Construction Set. Часть 3.
45px-Scroll.png

автор: Qwertiss
редактирование: Garin
ccылка на оригинал: Библиотека проекта Gidras Men
ссылка на сайт: Сайт проекта Gidras Men



Навигация по руководству:


Часть 1 - Часть 2 - Часть 3 - Часть 4



Предисловие (Garin):


Данная статья размещена на Румор Вики с любезного разрешения Qwertiss`a, за что ему наша признательность и благодарность.

Статья написана несколько лет назад, но все еще сохраняет свою актуальность и может быть полезна многим начинающим плагиностроителям, особенно в плане теоретических основ. Для практической работы рекомендуется скачать новые версии программного обеспечения.



От автора (Qwertiss):


Друзья, совместно с Mephala, которая перевела множество разрозненных материалов с английского языка на русский, нами было составлено это руководство по работе с DDS - форматом. Руководство ориентировано, в первую очередь, на непрямых специалистов, вернее, вообще не на специалистов, а на обычных пользователей, и призвано помочь им в достаточном для работы объеме, разобраться с форматом DDS и начать работать.

Руководство состоит из основной части и расширенных приложений.



Инструкции по работе с TES 3: Construction Set, часть 3

или ликбез для энтузиастов.



Часть 3. Формат DDS и Adobe PhotoShop

DDS - формат

Начнем с того, что формат изображения DDS весьма сложен и предназначен, в основном, для хранения текстур в различного вида игрушках и средствах 3D-графики. Отличает его большая степень сжатия изображений, генерация mip-карт, а также возможность использования в изображении альфа-канала.


Вопрос пользователя: Помогите, пожалуйста, с одной проблемой в Фотошопе. Почему, когда я открываю мой любимый DDS-файл с помощью Adobe Photoshop (у меня версия 8.0, использую «PhotoshopPlugins» для DDS), появляется несколько видов этой текстуры, от большой к малой, прикрепленной к главной текстуре? Как этого избежать, если можно? Это дико мешает в работе.


То, с чем столкнулся пользователь, как раз и есть одна из особенностей формата - MipMaps (mip-карты, см. рисунок ниже).


Что такое mip-карты?



Mip-карты – это последовательность выстраиваемых изображений от первоначального (М0) к самому маленькому (Мn) и предназначены для того, чтобы облегчить, в первую очередь, задачу движку игры и видеокарте. По мере удаления от объекта движок наслаивает на него более мелкую, легковесную и менее детализированную текстуру.


QW01 001.jpg


Чем ближе ваш игрок подходит к объекту - тем более детализированная текстура используется.


А теперь о том, что с этим делать в Adobe Photoshop...

  1. Делать ничего не надо, для новичков вообще лучше работать с форматами *.BMP и *.TGA. Для этого существуют специальные программы, конвертирующие DDS в эти форматы, но, если вы все-таки решились работать с форматом DDS напрямую, ... то читайте следующие далее практические рекомендации.
  2. Нужно запастись и скачать (все есть на нашем сайте) самые свежие версии плагинов к Photoshop и инструментов для работы с DXT (последняя версия на данный момент 5.12, но если у вас Photoshop не 7 и выше версии, если не установлен Direct3D 9.0, то вам лучше использовать версию 5.11)
  3. Плагины лучше устанавливать не в папку Photoshop, а в папку сопутствующего ему ImageReady.
  4. Открывая файлы в Photoshop, выскакивает диалоговое окно, в котором вы должны выбрать вариант открытия без загрузки mip-карт. Тогда на экране откроется уже более привычная, одиночная, основная (М0) картинка. С ней и нужно работать, а уж потом, при сохранении, уже выбирать варианты с генерацией или без mip-карт.


Более подробно о mip-картах можно прочитать в приложениях.


Alpha channel


Альфа-канал - это канал степени прозрачности, когда определенный цвет, контур цветов в изображении обрезается, с возможностью заполнения этой области изображением из другого слоя. В Морровинде это модели, обладающие некоторой степенью прозрачности. Альфа канал используется и в некоторых других форматах, .TGA и .PNG, например. Если проще, то он представляет собой некий субслой с некоторой степенью прозрачности, во вкладке "Слои" его и нужно искать, соответственно.


Не все модели в Морровинде используют этот канал, только некоторые, а именно те, где прозрачность необходима (всякие висюльки, кристаллы, кольчуги с просветом и т.п.)


Работа с Альфа-каналом - это большая, отдельная тема, более подробно можно прочитать в приложении, но пока несколько рекомендаций:

  1. Перекрашивая-переделывая текстуры с Альфа-каналом необходимо работать с основными слоями и не вмешиваться в уже созданный канал, иначе, как например, у одного из пользователей при работе с огненным големом может пропасть прозрачность и камни вокруг будут летать словно нарисованные на кальке.
  2. Все модели, имеющие Альфа-канал, нужно сохранять, естественно, с присутствием последнего. По ошибке (как, например, у меня с текстурой Альмы), вы можете лишиться Альфа-канала и вам придется начинать все заново или вновь создавать Альфа-канал, что достаточно муторное дело.
  3. Сохраняя модели с Альфа-каналом, лучше применять к ним ту форму DXT Compression (сжатия), которая была применена изначально.


DXT Compression/Decompression и сохранение текстур


Это тоже отдельная и весьма пространная тема, здесь много нюансов и сложностей. Подробно мы ее обсудим в приложении, а пока только некоторые рекомендации: При сохранении текстур в формате DDS выскакивает примерно такое окно (версия до 5.11 включительно), где вам предлагается выбрать параметры (в частности) DXT сжатия (см. рисунок):


QW02 002.jpg


Форматы с сжатием:

  • DXT1, DXT1 с alpha, DXT3 и DXT5.
  • DXT1 – диапазон сжатия 8:1
  • DXT3 и DXT5 – диапазон сжатия 4:1


Другие форматы, без сжатия:

  • 16 bit (4:4:4:4) - 4 бита для альфа-канала, красного, зеленого и синего цветов.
  • 16 bit (1:5:5:5) - 1 бит для альфа, по 5 бит для красного, зеленого и синего цветов.
  • 16 bit (5:6:5) – без альфа-канала, 5 бит для красного, 6 бит для зеленого и 5 бит для синего цветов.
  • 32 bit RGB – по 8 бит для альфа-канала, красного, зеленого и синего цветов.
  • 24 bit RGB – по 8 бит для красного, зеленого и синего цветов.
  • 16 bit (0:5:5:5) – по 5 бит для красного, зеленого и синего цветов.
  • 8 bit index – создание 256-цветной палитры для текстур RGB или RGBA
  • V8U8 - Environment-Mapped Bump Mapping (EMBM) format. 16 бит
  • CxVuU8 - Compressed Normal map format C = sqrt(1 - (U2 + V2)). 16 бит
  • A8 – Только Альфа-канал, 8 bit
  • 4 bit indexed – создание 16-цветной палитры для текстур RGB или RGBA


Вот сколько вариантов на выбор вам предлагается!


Что с этим делать? Если проще, то такое количество обусловлено, в первую очередь, параметрами конкретного движка и иными специальными требованиями. Поскольку нас интересует конкретно игра Морровинд, то он поддерживает форматы DXT1, DXT1 с alpha-каналом, DXT3 и DXT5, их мы и будем использовать.


Какой же из форматов выбрать?

  1. При переделке текстур, как уже было сказано выше, всегда лучше использовать тот формат, который был применен изначально.
  2. Для статичных, без особых требований, объектов преимущественно используют DXT1.
  3. Для динамичных и с alpha-каналом - DXT3.
  4. DXT5 используют крайне редко и только в особых случаях. Подробно об этом в приложении.


Для желающих заморочиться по-крупному мы прилагаем дополнительные материалы по работе с утилитами от nVidia


Приложения

Утилиты компрессии NVIDIA DXT:


  • Adobe PhotoShop DXT Compression Plugin - Читает и записывает файлы .dds со сжатием и без него.
  • Adobe PhotoShop Normal Map Plugin - Создает карты нормалей из карт вершин для отображения каждого пикселя.
  • Command Line Compression Tools - Утилита командной строки для компрессии/декомпрессии изображений.
  • nvDXTLib.lib - Библиотека компрессии для использования в ваших утилитах, с примерами

Автор программного обеспечения Doug Rogers, NVIDIA Corporation

Сообщения о багах и запросы на дополнительные функции отсылайте ему.


Приложение 1. Утилита DXT-сжатия Adobe PhotoShop DXT Compression Plugin

Составлено на основе справочных материалов nVIDIA и других источников.


Утилита DXT-сжатия и декомпресии Adobe PhotoShop DXT Compression Plugin от nVIDIA читает и записывает файлы .dds со сжатием и без него.

DXT Compression Plugin входит в набор утилит и является плагином для Adobe PhotoShop, файл -dds.8bi


Для работы требуется Direct3D 8.0 и выше.

Скопируйте файл dds.8bi в директорию:

   \Program Files\Adobe\Photoshop 7.0\Plug-Ins\File Formats 

или

   \Program Files\Adobe\Photoshop 6.0\Plug-Ins\File Formats


Утилита также работает в Paint Shop Pro.

Чтобы сохранить сжатые файлы, используйте пункт меню «Save As» (Сохранить как), выберите «DDS».

Утилита позволяет также открывать dds-файлы в PhotoShop.


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


Здесь нужно сказать, что движок Морровинда также их прочитать не сможет, поскольку, как и все полигональные движки, он работает с текстурами, кратными степени 2.


Другими словами, сохраняя изображение, его нужно сохранять в размерах, кратных 2n, например, 128х128, 256х256 или 512х512 - это наиболее распространенные размеры.

А также: 128х256, 128х512, 64х512, 32х128, 2х256 и т.д. и т.п.

Но никак не 247х314, 75х493 и другие подобные изуверства.


Save Format (Формат сохраняемых файлов)


Выберите один из форматов сохранения. Формат зависит также от параметров в полях Options (Опции) и Fade to color (Градиент цвета):

  • DXT1 - формат без aльфа-канала, с компрессией, степень сжатия - 8:1
  • DXT1 - формат с 1-битовым aльфа-каналом и компрессией
  • DXT3 - формат с 8-битовым aльфа-каналом и компрессией, степень сжатия - 4:1
  • DXT5 - формат с интерполированным aльфа-каналом и компрессией, степень сжатия - 4:1


Это, друзья, основные форматы, с которыми нам предстоит работать, и DXT3 - основной из них. Что выбрать и в каком случае?


Не вдаваясь в подробности, нужно сказать, что:

  • DXT1 используют везде, где нет особых требований к качеству текстуры и не нужен канал прозрачности. Это практически все статические модели, домики, стены и т.п., некоторые существа (где нет прозрачных областей) и доспехи.
  • DXT1 с 1-битовым aльфа-каналом и компрессией используется там, где нет особых требований к качеству текстуры и качеству прозрачности.
  • DXT3 - основной формат для текстур с требованиями прозрачностей, используется там, где нужна прозрачность с четкими границами и высокая степень деталлизации.
  • DXT5 - используется, соответственно, там, где требуется интерполированный альфа-канал (очень редко, практически всегда можно обойтись и без этого)


Для чего нужно сохранять в том или ином формате?


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


Остальные форматы без компрессии (так, для примера. Мы их все равно использовать не будем, хотя пару из них движок Морровинда все же видит):

  • 16 бит (4444) - по 4 бита на каналы: альфа, красный, зеленый, синий
  • 16 бит (1555) - 1 бит на альфа-канал, по 5 на for красный, зеленый, синий
  • 16 бит (565) - без альфа-канала, 5 бит на красный, 6 бит на зеленый, 5 бит на синий
  • 32 бит RGB - по 8 бит на каналы: альфа, красный, зеленый, синий
  • 24 бит RGB - по 8 бит на каналы: красный, зеленый, синий
  • 16 бит (0:5:5:5) по 5 бит на каналы: красный, зеленый, синий
  • 8 бит индекс - создание текстуры с палитрой RGB или RGBA


Options (Опции):


  • Dither/Размытие - улучшает качество 16-битных изображений. После наложения эффекта размытия генерируются MIP-уровни. Это весьма спорное улучшение и, скажем так, не всегда оправданное. Модели, где присутствуют множество мелких, но важных деталей, будут выглядеть неудовлетворительно после применения этой примочки.
  • DitherEachMIP/Размытие каждого MIP-уровня - эффект размытия применяется для каждого MIP-уровня. Почти то же самое, но с извращением на всех мип-уровнях. Трудно себе представить, кому и для чего понадобилось-бы включать эту опцию. Единственное, что приходит в голову, из практики, - моделлеры зачастую не являются художниками, не умеют рисовать и работать с текстурами, тогда для них, на непроработанных текстурах, это может и потребоваться.
  • GreyScale/Серая шкала - отметьте, если все изображение или его большая часть представляет собой оттенки серого. Это еще одна примочка для движка, преимущественно, т.к. современные движки сами уже видят, где серое, а где цветное изображение и радужных муаров быть не должно.
  • Binary Alpha/Бинарный альфа-канал - рассматривает альфа-канал как 1 бит, только для генерации MIP-уровней. Тоже, преимущественно, нам не нуна.
  • Alpha Border/Граница альфа - устанавливает границу текстуры с альфа-каналом на каждом MIP-уровне. А это ценная "весчь"! Там, где требуются четкие границы во всех мип-уровнях, Огненный Атронах, например, различные спец-эффекты, эту функцию нужно использовать.
  • Fade To Color/Градиент цвета - плавно изменяет рисунок текстуры до слияния с выбираемым цветом на n MIP-уровней. Тоже трудно себе представить область применения в современных игрушках.
  • Normalize MIP maps/Нормализовать MIP-уровни - используется при экспорте нормальных MIP-уровней. Используется чаще всего там, где не нужно ничего особенного, специального.
  • DuDv - используется при экспорте MIP-уровней типа DuDv
  • Override/Наложение - Просмотр xbox-версии формата DXT1
  • Preview Options/Опции предпросмотра:
  • Alpha Blending/Альфа-смешение - включает/отключает альфа-смешение с использованием альфа-канала текстуры
  • Show Differences/Показать различия - позволяет сравнить первоначальное точное изображение с изображением в выбранном режиме
  • Enable Filtering/Фильтры - включает/отключает все фильтры текстуры
  • Mip Mapping/Генерация MIP-уровней - включает/отключает генерацию MIP-уровней
  • Anisotropic/Анизотропные фильтры - включает/отключает анизотропные фильтры


QW02 002.jpg


  • Опция Fade MIP maps/Градиент MIP-уровней:
Вы можете свести каждый MIP-уровень до определенного цвета:
  • Кнопка Fade Color/Конечный цвет - выбирает конечный цвет градиента.
  • В поле Blend Amount/Величина смешения указывается степень градиента на каждый MIP-уровень.
  • В поле Start at MIP/Начать с уровня указывается, с какого MIP-уровня применяется градиент
  • Кнопка Specify/Подробнее позволяет устанавливать степень градиента на каждом MIP-уровне. Вызывает следующее диалоговое окно:


QW03 203.jpg


  • MIP 0 - к базовому изображению градиент неприменим.
  • Установите степень градиента для каждого MIP-уровня. Вы можете сохранить до 10 профилей (моделей) градиентов при помощи кнопок Set1...Set10 в правой части окна.
  • Данное окно будет неактивно, если в изображении нет MIP-уровней.


Приложение 2: Фильтр карты нормалей Adobe PhotoShop Normal Map Plugin

Плагин Adobe PhotoShop Normal Map Plugin создает карты нормалей из карт вершин для отображения каждого пикселя.

Установка:


  • Скопируйте файл NormalMapFilter.8bf в директорию C:\Program Files\Adobe\Photoshop 6.0\Plug-Ins\Filters


Работа с фильтром


Чтобы запустить фильтр, выберите пункт меню Filter/Фильтр -> nvTools -> NormalMapFilter


QW04 304.jpg


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


QW05 305.jpg


Нормальные маски создаются с использованием смежных элементов текстур (текселей). Количество текселей устанавливается в поле Height Generation / Генерация высоты.

  • Scale / Масштаб - показывает, во сколько раз изменяется высота
  • MinZ / МинимумZ - устанавливает минимальное значение в направлении "вверх"
  • 3D Preview / 3D предпросмотр - трехмерный просмотр изображения с наложенной нормальной маской
  • Du/Dv - используется для создания масок типа EMBM
  • Alternate conversions / Другие преобразования
  • Biased RGB \ Смещенный RGB - выделяет средний цвет каждого текселя изображения
  • Red / Красный - Использовать в качестве высоты высоту красного канала
  • Green / Зеленый - Использовать в качестве высоты высоту зеленого канала
  • Blue / Синий - Использовать в качестве высоты высоту синего канала
  • Max / Максимум - Использовать в качестве высоты наибольшую из высот красного, зеленого и синего каналов
  • Color space / Цветовое пространство - высота = 1.0 - [(1.0 - красный) * (1.0 - зеленый) * (1.0 - синий)]
  • Поле Alpha Field / Альфа-канал показывает содержимое альфа-канала после генерации нормальной маски. Варианты:
  • Unchanged - без изменений
  • Height - высота
  • Set to 0.0 - установить на 0.0
  • Set to 1.0 - установить на 1.0
  • Выберите Using Multiple Layers / Использовать несколько слоев, если вы используете слои, и альфа-канал не работает.

Следующее окно с предупреждением появляется, если в изображении выбраны только три канала. Фильтр будет работать только с теми каналами, которые выбраны.

(Сообщение: выбрано только три канала, высота альфа-канала будет недоступна)


QW06 306.jpg


Если вы хотите создать маску с альфа-канала, выберите альфа-канал изображения во вкладке "каналы".


Приложение 3: Утилиты сжатия при помощи командной строки

  • nvDXT.exe - использование командной строки для пакетного сжатия
  • detach.exe - извлекает MIP-уровни из файла .dds
  • stitch.exe - комбинирование MIP-уровней в один файл .dds
  • readDXT.exe - чтение сжатого изображения и его запись в файл .tga (в исходный)


NVDXT - Уникальная утилита для пакетного сжатия



Функции NVDXT:


  • компрессия изображений
  • создание нормальных масок с цветных или альфа-каналов
  • создание масок DuDv
  • создание кубических масок
  • запись в файл .dds
  • обработка нескольких файлов
  • чтение форматов .tga, .bmp, .gif, .ppm, .jpg, .tif, .cel, .dds
  • фильтрация MIP-уровней

Опции:


  • nomipmap - не генерировать MIP-уровни
  • fade - градиент MIP-уровней
  • dither - добавить размытие
  • rescale <nearest, hi, lo> - изменить масштаб изображения до ближайшего (nearest), последующего (hi) или предыдущего (lo) значения 2n (пример: ваше изображение 100х100; ближайшие к нему числа 2n - 64 и 128; соответственно, выбирая nearest и hi, вы увеличиваете масштаб изображения до 128х128, выбирая lo - уменьшаете его до 64х64)
  • flip - повернуть "вверх ногами".
  • timestamp - обновить только измененные файлы
  • list <filename> - список файлов к обработке
  • cubemap <filename> - создать кубическую маску <имя>. Файлы указаны в опции -list
положительное значение x, отрицательное x, положительное y, отрицательное y, положительное z, отрицательное z
  • all - все файлы изображений в текущей директории
  • outdir - директория записи
  • deep [directory(имя папки)] - включить все подкаталоги
  • outsamedir - чтение и запись в одну и ту же директорию
  • overwrite - если входной файл имеет формат .dds, переписать старый файл
  • file - ввести файл для обработки. Допускаются нейтральные символы
  • 24 <dxt1c, dxt1a, dxt3, dxt5, u1555, u4444, u565, u8888, u888, u555> - сжать в 24-битное изображение в одном из перечисленных форматов
  • 32 <dxt1c, dxt1a, dxt3, dxt5, u1555, u4444, u565, u8888, u888, u555> - сжать в 32-битное изображение в одном из перечисленных форматов
  • swap - переставить RGB-каналы
  • binaryalpha - принять дла альфа значение 0 или 1
  • alphaborder - окаймить изображение полем альфа = 0
  • fadeamount - процент (степень) градиента для каждого MIP-уровня. По умолчанию 15
  • fadecolor - градиент маски (цветной, нормальной или DuDv) на MIP-уровнях
  • fadetocolor <hex color> - конечный цвет градиента
  • fadealpha - градиент альфа на MIP-уровнях
  • fadetoalpha - конечное значение градиента альфа [0-255]
  • border - окаймить изображение цветом
  • bordercolor <hex color> - цвет окаймления

Опции формата текстуры. По умолчанию используется формат DXT3:


  • dxt1c : DXT1 (только цвет)
  • dxt1a : DXT1 (1-бит альфа)
  • dxt3 : DXT3
  • dxt5 : 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 bit

Опции фильтрации MIP-уровней:


  • cubic : кубический фильтр
  • kaiser : кайзеровский фильтр
  • gamma : кайзеровский гамма-фильтр
  • full : полный фильтр ДПФ (дискретное преобразование Фурье)


Чтобы создать маску (нормальную или dudv), выберите одно из:


  • n4 : нормальная 4 cэмпла
  • n3x3 : нормальная 3x3 фильтр
  • n5x5 : нормальная 5x5 фильтр
  • n7x7 : нормальная 7x7 фильтр
  • n9x9 : нормальная 9x9 фильтр
  • dudv : DuDv

а также источник данных по высоте:

  • alpha : альфа-канал
  • rgb : средний по rgb
  • biased : средний по rgb смещенный
  • red : красный канал
  • green : зеленый канал
  • blue : синий канал
  • max : наибольший из (r,g,b)
  • colorspace : смесь r,g,b
  • norm : нормализовать MIP-уровни (источник - нормальная маска)

Опции нормальных/DuDv масок:


  • aheight : сохранить вычисленную высоту в альфа-поле
  • aclear : очистить альфа-канал
  • awhite : принять альфа-канал = 1.0
  • scale <float> : масштаб высотной маски. По умолчанию 1.0
  • wrap : "завернуть" текстуру. По умолчанию отключено
  • minz <int> : минимальное значение вектора "вверх" [0-255]. По умолчанию 0

Примеры:


   nvdxt -cubemap cubemap.dds -list cubemapfile.lst
   nvdxt -file test.tga -dxt1c
   nvdxt -file *.tga
   nvdxt -file height_field_in_alpha.tga -n3x3 -alpha -scale 10 -wrap
   nvdxt -file grey_scale_height_field.tga -n5x5 -rgb -scale 1.3
   nvdxt -file normal_map.tga -norm
   nvdxt -file image.tga -dudv -fade -fadeamount 10
   nvdxt -all -dxt3 -gamma -outdir .\dds_dir -time


Версия NVDXT 5.01


Комментарии, баги и запросы по этой версии высылайте на мейл: doug@nvidia.com

Версия 5.01 читает файлы следующих форматов:

       .tga
       .bmp
       .gif
       .ppm
       .jpg
       .tif
       .cel
       .dds

Известные баги версии 5.01: При работе с форматом .jpg меняются местами RGB-каналы


Detach


Применение:

detach <имя_источника>

Расширение файла .dds не указывается.

Например, чтобы извлечь MIP-уровни из файла wood.dds, набирайте

detach wood


Stitch


Применение:

stitch <имя_источника>

Расширение файла .dds не указывается.

Например, чтобы объединить MIP-уровни из файлов wood_00.dds,.. wood_01.dds,...:

stitch wood



Приложение 4. Библиотека компрессии / декомпрессии DXT

nvDXT представляет собой библиотеку компрессии и декомпрессии, с помощью которой вы можете связать свои существующие проекты.


Вы задаете параметры компрессии в блоке CompressionOptions (Опции компрессии), расположенном в разделе nvdxt_options.h. Во время компрессии библиотека сама генерирует MIP-уровни. Вы также можете назначить собственные параметры обратной связи при генерации каждого MIP-уровня.


Декомпрессор "разжимает" все MIP-карты и объединяет их в одном файле изображения.


Название библиотеки: nvDXTLib.lib.


Компрессия


Сжимает изображение с заданными пользователем параметрами обратной связи для каждого генерируемого MIP-уровня. Обратная связь с пользователем осуществляется на каждом этапе генерации MIP-уровней.

Поддерживатся ввод изображений RGB 24 или ARGB 32 бит/пиксель. Для примера, см. nvDXT.cpp (требует NVSDK):

     
HRESULT nvDXTcompress(unsigned char * raw_data, // указатель данных (24 или 32 бит)
    unsigned long w, // ширина в текселях
    unsigned long h, // высота в текселях
    DWORD pitch, // в байтах
    CompressionOptions * options,  // блок описывается в nvdxt_options.h
    DWORD depth, // 3 или 4
    MIPcallback callback = 0); // обратная связь для генерируемых уровней


если callback == 0 (или значение не указано), то вместо обратной связи с пользователем вызывается WriteDTXnFile со всей информацией файла.

    typedef HRESULT (*MIPcallback)( 
        void * data,     // указатель на сжатые данные 
        int miplevel,    // текущий MIP-уровень 
        DWORD size       // размер данных 
    ); 

    // Необходимо указать программы или суррогаты
    // void WriteDTXnFile(count, buffer);
    // void ReadDTXnFile(count, buffer);
    // 
    //
  void WriteDTXnFile(DWORD count, void * buffer);
  void ReadDTXnFile(DWORD count, void * buffer);

Заполните блок CompressionOptions (Опции компрессии):

typedef struct CompressionOptions 
{
bool bMipMapsInImage; // mip-карты загружены во время чтения
short MipMapType; // dNoMipMaps (нет mip-карт),
dSpecifyMipMaps (указать mip-карты),
dUseExistingMipMaps (использовать существующие mip-карты),
dGenerateMipMaps (генерировать mip-карты)
short SpecifiedMipMaps; // если выбрано dSpecifyMipMaps (количество генерируемых mip-карт)
short MIPFilterType; // для MIP-карт
/*
для MIPFilterType выберите одно из:
    dMIPFilterBox
    dMIPFilterCubic
    dMIPFilterFullDFT
    dMIPFilterKaiser
    dMIPFilterLinearLightKaiser
*/
bool bBinaryAlpha; // альфа-канал = 0 или 1
bool bNormalMap; // нормальная карта
bool bDuDvMap; // карта DuDv (EMBM)
bool bAlphaBorder; // сделать альфа-окаймление
bool bBorder; // сделать цветное окаймление
tPixel BorderColor; // цвет окаймления
 
bool bFadeColor; // градиент цвета на mip-уровнях
bool bFadeAlpha; // градиент альфа на mip-уровнях
tPixel FadeToColor; // конечный цвет градиента
int FadeToAlpha; // конечное значение градиента альфа (0-255)
int FadeToDelay; // начать градиент после 'n' MIP-карт
int FadeAmount; // степень (процент) градиента
bool bDitherColor; // применить размытие при 16-битной конвертации
bool bDitherEachMIPLevel;// применить размытие при 16-битной конвертации на каждом MIP-уровне (после фильтрации)
bool bGreyScale; // принять изображение за оттенки серого
 
short TextureType; // обычный деколь, кубический или объемный
/*
для TextureType (тип текстуры) выберите одно из:
    dTextureType2D
    dTextureTypeCube
    dTextureTypeImage
*/
short TextureFormat;
/*
для TextureFormat (формат текстуры) выберите одно из:
dDXT1,
dDXT1a,
dDXT3,
dDXT5,
d4444,
d1555,
d565,
d8888,
d888,
d555,
пока не поддерживаются: dNVHS, dNVHU
*/
bool bSwapRGB; // поменять местами цвета R и G
} CompressionOptions;
     // коды сообщений об ошибках
  #define DXTERR_INPUT_POINTER_ZERO -1
  #define DXTERR_DEPTH_IS_NOT_3_OR_4 -2
  #define DXTERR_NON_POWER_2 -3 


Пример обратной связи для хранения сжатого изображения в текстуре Direct3D:

    LPDIRECT3DTEXTURE8 pCurrentTexture = 0; 

    HRESULT LoadAllMipSurfaces(void * data, int iLevel)
    {
        HRESULT hr;
        LPDIRECT3DSURFACE8 psurf;
        D3DSURFACE_DESC sd;
        D3DLOCKED_RECT lr;

        hr = pCurrentTexture->GetSurfaceLevel(iLevel, &psurf);

        if (FAILED(hr))
            return hr;
        psurf->GetDesc(&sd);

        hr = pCurrentTexture->LockRect(iLevel, &lr, NULL, 0);
        if (FAILED(hr))
            return hr;

        memcpy(lr.pBits, data, sd.Size);

        hr = pCurrentTexture->UnlockRect(iLevel);
    
        ReleasePpo(&psurf);

        return 0;
    }
        calling sequence
    hr = D3DXCreateTexture(m_pd3dDevice, Width, Height, nMips, 0, D3DFMT_DXT3, D3DPOOL_MANAGED, &pCurrentTexture); 
   nvDXTcompress(raw_data, Width, Height, DXT3, true, 4, LoadAllMipSurfaces);


Если у вас есть существующие MIP-карты, вам необходимо совместить их так, чтобы за первым MIP-уровнем шел следующий, и т.д. Схематически это выглядит так:


QW07 507.jpg


Если в CompressionOptions (Опциях компрессии) указано:

MipMapType = dUseExistingMipMaps;

то вы должны указать все MIP-уровни:

nvDXTcompress((unsigned char *)raw_data, width, height, pitch, &options, depth, 0);
width = src_pitch * 2
pitch = src_pitch * 2


Декомпрессия


При декомпрессии изображения используйте данный запрос, чтобы прочитать все цепочки MIP-карт в один буфер:

unsigned char * nvDXTdecompress(int & w, int & h, int & depth, int & total_width, int & rowBytes, int & src_format);
 

Возвращает указатель данных изображения:

  • w : ширина изображения
  • h : высота изображения
  • depth : количество байт на пиксель, 3 или 4
  • total_width : общее количество текселей в ширине получаемого изображения.
  • byte_pitch = total_width * depth


Следующая MIP-карта начинается с

основа + row_bytes (кол-во байт в ряду)

а следующая за ней - с

основа + row_bytes / 2

и т.д.

  • src_format : формат файла-источника


QW08 508.jpg


В качестве примера см. readdxt.cpp


Приложение 5: Альфа-канал

Итак, как мы уже и говорили, α-канал - это канал с некоторой степенью прозрачности. Основной его задачей является передача степеней прозрачности изображения.


Ничего в нем сложного нет, и в его создании тоже.


Возьмем конкретный пример, конкретную задачу - создать иконку для предмета, в данном случае для Шкатулки Душ, созданной мной для плагина Люди Гидры.


Иконки в инвентаре Морровинда имеют прозрачный фон, а это значит, что нам необходим α-канал.


Загружаем нужное изображение в Adobe Photoshop или в любую иную прогграмму, работающую с каналами изображения. Здесь мы рассмотрим Photoshop - как самую распространенную программу и плагин к ней для работы и экспорта в DDS.


Вот наша шкатулка. Работая в 3DSMax, очень удобно сохранять изображение в просмотрщике в формате PNG. Это изображение мы и возьмем за основу:


QW09 601.jpg


Разными способами можно создать α-канал, можно его просто нарисовать(для мазохистов) но удобнее всего вычленить его из слоя. Потому создаем новый слой, просто копируя имеющийся:


QW10 602.jpg


"Слой 0 копи" - выделен у нас, с ним и поработаем....

Обесцветим, затемним, инструментом "Порог изображения" добьемся максимальной однородности изображения. Вот что получилось:


QW11 603.jpg


Совершенно черный куб в 2-D проекции! (чувствуете себя Малевичем?)

Это уже можно сохранить и выставить где-нить в галерее...

Далее --> инвертируем изображение:


QW12 604.jpg


и создаем новый слой (для фона) просто копируя этот, закрашиваем новый слой "Слой 0 копи 2" абсолютно черным:


QW13 605.jpg


Сливаем (объединяем) нижние слои в один:


QW14 606.jpg


теперь выделяем инструментом "Волшебная палка" наш кубик и переходим во вкладку "Каналы"


QW15 607.jpg


Жмем кнопочку (указана стрелкой) "Сохранить выделение как канал".


Все! Канал создан, можно курить бамбук! α-канал мы создали, но иконка еще не сделана....


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


QW16 608.jpg


Теперь сливаем (объединяем) все слои - жмем на "Выполнить сведение"


QW17 609.jpg


Вот что у нас получилось! Круто! Шкатулка на черном фоне! Теперь можно пройти во вкладку "Каналы", включить наш α-канал и посмотреть, что получилось:


QW18 610.jpg


Круто! Все работает! Попереключайте канал - видно, как он просто отсекает фон и оставляет только изображение - это нам и нужно.


Все, теперь можно сохранить нашу иконку... Сохраняем как DDS, можно и как TGA, но плагины моего "шопа" не позволяют сохранять α-канал в этом формате, можно и как PNG, но "шоп" тоже не позволяет сохранять α-канал в этом формате, да и игра Морровинд его не поддерживает. Можно сохранить и как GIF, так, для прикола, все равно его движок игры не видит....

Вот такая панель вылетает при сохранении в DDS.


QW19 611.jpg


Выбираем формат DTX3 с 8-мибитовым α-каналом. DTX1 нам тут не подходит, т.к. у него α-канал 1-битовый и изображение будет размазанным, слишком уж маленькое...

Пояснение, так, на всякий случай:
Размер изображения для иконки в игре Morrowind нужно выбирать как 32х32 !
И вообще, все изображения для игрушек с движками полигонального типа (т.е., работающих с полигонами) нужно делать симметричными кратности. Т.е., движок работает как обычная прога - приложение 16- или 32- или 48-миразрядное (что крайне редко пока), и изображение, которое он наслаивает на полигоны, должно быть кратным этим разрядам, т.е. 2!
Например, 2х2,4х4, 8х8, 16х16, 32х32 и т.п., 128х256, 256х512, 2х256...
Но никак не 257 или 120 х 512!


С MIP-картами тут - на ваше усмотрение. По идее, они тут не нужны, я показал здесь изображение из просмоторщика с MIP-картами, так, для наглядности:


QW20 612.jpg


На этом все, иконка сделана! Остальное аналогично...



Удачи, и не запутайтесь в слоях!

Qwertiss

Сайт Gidras Men


Навигация по руководству:


Часть 1 - Часть 2 - Часть 3 - Часть 4