Создание текстуры с использованием альфа канала в формате dds. Форматы и специфика текстур и карт DDS

16.05.2019

Загрузка сжатых текстур из файлов формата DDS.

Большинство программ для хранения сжатых текстур используют формат DDS (Direct Draw Surface). Как видно из названия, этот формат предназначен для приложений, использующих API DirectDraw и Direct3D. Формат DDS обладает следующими преимуществами по сравнению с другими распространёнными форматами: возможность хранения текстуры вместе со всеми MipMap-уровнями в одном файле, возможность сохранения 6-ти двухмерных текстур кубической текстуры в одном файле и, наконец, поддержка форматов сжатых текстур S3TC (DXT1, DXT2, DXT3, DXT4 и DXT5). Причём, не смотря на то, что этот формат был разработан для API DirectX, его можно довольно легко "подружить" и с OpenGL.

Существует множество утилит для создания DDS файлов: плагины для Photoshop, 3DS MAX и т.д. Для создания DDS файлов для этой статьи я использовал утилиту nvdxt, которую можно скачать либо с сайта NVIDIA Developer (http://developer.nvidia.com/), либо в составе примеров с этого сайта (). Хотя данная утилита и предназначена для работы в командной строке, ей очень просто пользоваться. Создавая примеры для этой статьи, я использовал команды следующего формата:

nvdxt.exe -file "имя файла" {-формат сжатия=dxt1/dxt3/dxt5}.

Т.е. если нам необходимо сжать файл wood.tga в wood.dds используя формат DXT5, то можно воспользоваться командой

Nvdxt.exe -file WOOD.TGA -dxt5.

Мы рассмотрим работу с файлами формата DDS с использование класса CTexture из состава NVIDIA OpenGL SDK. Конечно, с файлами формата DDS можно работать и напрямую, как мы поступили с форматом SCI, но это лишь усложнит программу и увеличит вероятность появления ошибок. Но если вам всё таки необходимо работать с DDS-файлами напрямую, то можно посоветовать посмотреть исходники класса CTexture.

Перед использованием этого класса в каталог с проектом программы следует скопировать файлы nv_dds.h и nv_dds.cpp, которые находятся в каталогах ":\include\shared" и ":\src\shared" соответственно. После этого первый файл подключается к программе директивой #include, второй - через меню Visual Studio (Project -> Add New Item ..., см. рис. 5).

Рисунок 5.

Использование этого класса проще всего показать на примере - модификации программы Ex03 из предыдущей части статьи, в которую добавлена поддержка чтения текстур из DDS-файлов (Ex04):

//Создание объекта для работы с файлами формата DDS CDDSImage image; if (!image.load(filename) ) { console.add("Bad file or file not found" ) ; glCompressedTexImage2DARB(texture0.target, 0 , image.format, image[ 0 ] .width, image[ 0 ] .height, 0 , image[ 0 ] .size, image[ 0 ] ) ; char str[ 200 , image[ 0 ] .mipmaps.size() ) ; console.add(str) ; //Загрузка остальных MipMap-уровней в видеопамять for (int i=0 ; i< image[ 0 ] .mipmaps.size() ; i++) { glCompressedTexImage2DARB(texture0.target, i+1 , image.format, image[ 0 ] .mipmaps[ i] .width, image[ 0 ] .mipmaps[ i] .height, 0 , image[ 0 ] .mipmaps[ i] .size, image[ 0 ] .mipmaps[ i] ) ; }

Как видно, работа с файлами формата DDS осуществляется при помощи объекта класса CDDSImage. Загрузка текстуры осуществляется методом load(), который в случае успешной загрузки возвращает ненулевое значение. Обратите внимание, что на самом деле метод load() принимает ещё и второй аргумент flipImage, который по умолчанию равен true. Если этот параметр равен true, то текстура переворачивается при загрузке. Загруженные текстуры сохраняются в объектах класса CTexture, которые находиться поле-векторе images класса CDDSImage, доступ которому возможен и использованием перегруженного оператора . Однако, если вы не используете кубических текстур, в поле images будет храниться всего одна текстура. Ширина, высота, формат пикселей и размер текстуры хранятся в полях width, height, format и size соответственно. Указатель на образ сжатой текстуры хранится в поле pixels подобъекта image, имеющего класс CSurface, причём доступ к полю pixels может быть осуществлен при помощи перегруженного оператора operator char* класса CTexture, т.е. вместо ссылки на образ сжатой текстуры можно просто указывать экземпляр класса CDDSImage.

Если DDS-файл содержит MipMap-уровни, то они будут размещены в объектах класса CSurface, которые находятся в поле-векторе image соответствующих объектов класса CTexture. Класс CSurface так же имеет поля width, height, format и size, которые аналогичны полям класса CTexture.

Как указывалось выше, файлы формата DDS могут содержать и образа несжатых текстур. Поэтому реальное приложение должно сначала определить формат пикселей текстуры, а затем использовать команды glTexImage() и glCompressedTexImage() для загрузки соответственно несжатых и сжатых текстур.

Стоит так же отметить небольшую модификацию интерактора консоли glut_console, в которую была добавлена поддержка истории команд.

Загрузку DDS файлов можно ещё упростить, воспользовавшись методом upload_texture_2D класса CDDSImage, использование которого продемонстрировано в следующем примере (Ex05):

CDDSImage image; if (!image.load(filename) ) { console.add("Bad file or file not found" ) ; return ; } //При использовании обычных (не кубических) текстур, первый параметр всегда равен 0. if (!image.upload_texture2D(0 , texture0.target) ) { console.add("Unsupported type of texture" ) ; return ; }

Кроме того, в этот пример добавлена поддержка работы с файлами tga. Это сделано для более точного анализа потери качества текстур при S3TC-компрессии, т.к. JPG-текстуры даже максимального качества всё равно проигрывают в качестве оригинальным текстурам.

В заключение обзора работы со сжатыми текстурами я хотел обратить ваше внимание на то, что хранение текстур на диске в сжатом виде связано с потенциальной опасностью. Дело в том, что если приложение запустится на видеокарте, которая не поддерживает сжатие текстур, то использовать эти текстуры будет невозможно. Кроме того, возможна ещё более неприятная ситуация - видеокарта поддерживает работу со сжатыми текстурами, но не поддерживает формат сжатия, в который использует сжатая текстура. Поэтому, если вы рассчитываете, что вашу программу будут использовать на ускорителях 4-х летней давности и ваше приложение очень критично к занимаемому месту на диске, то сжатые текстуры лучше всего хранить в JPG-файлах, а при загрузке в видеопамять использовать автокомпрессию текстур.

Расширения ARB_texture_compression и EXT_texture_compression_s3tc поддерживаются всеми видеокартами NVIDIA начиная с GeForce256.

На этом всё.

Файлы.dds не предназначены для рядовых пользователей. Поэтому довольно странно, если вы вдруг обнаружили его случайно на вашем компьютере. Но как и любой другой формат, этот можно открыть, а также отредактировать при помощи специального софта.

Для чего нужен?

Документы формата DDS содержат в себе информацию о 3D-текстурах. Это сжатые растровые изображения , которые применяются во многих 3D-приложениях, в особенности в компьютерных и консольных играх. Алгоритм сжатия позволяет использовать текстуры на таких консолях, как Xbox 360 и Play Station 3: Bethesda особенно часто делает объекты в своих играх через «дидиэс». Формат поддерживается большинством видеокарт , программой DirectX, а также программным обеспечением, которое выпускается производителями видеокарт.

Как открыть DDS?

Файл представляет собой растровую картинку. А значит, его можно открыть через графические редакторы. Вот только не всегда можно редактировать. Существуют специальные конвертеры, которые трансформируют эти файлы в более привычные для стандартного ПО форматы: .bmp, .jpeg и т. п. Это, например, Right Click Image Converter. Утилита быстро переведёт.dds в более «лёгкое» расширение.

С редактированием всё немного сложнее. Здесь уже не обойтись без помощи специальных программ для обработки растровых 3D-изображений. Открыть файл с этим расширением и в дальнейшем редактировать можно через такие программы, как Paint.NET, XnView, Windows Texture Viewer. Но больший интерес для каждого дизайнера представляет, наверное, Photoshop, с помощью которого удобнее работать с этим форматом, да и с другими тоже.

Photoshop

Чтобы открыть файл в Фотошопе , нужен плагин, выпускаемый компанией NVIDIA, - NVIDIA Texture Tools for Adobe Photoshop. Скачивается бесплатно, но, разумеется, нужно иметь уже установленный редактор от Adobe.

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

Зачем нужны DDS файлы

Файлы с расширением dds предназначены для хранения изображений растрового формата. Рассматриваемый формат был разработан компанией Microsoft и изначально был создан SDK.

Что хранится в DDS файлах

Чаще всего файлы формата dds содержат данные о трехмерных текстурах. Они используются во многих программах для работы с 3d графикой, а также в современных играх с трехмерной графикой. В последнем случае в таких файлах хранятся текстуры и карты окружающей среды, которые задействуются в игровых приложениях. Кроме того, в файлах формата dds могут храниться заставки рабочего стола.

Формат.DDS разработан MS в целях использования в DirectX — он хранит данные о трехмерных текстурах, которые используются, к примеру, в играх

Одно из преимуществ формата заключается в том, что его поддерживают видеокарты DXTn, драйвера которых способны сжимать текстуры «на лету», что обеспечивает быстродействие. Сами файлы dds могут содержать текстуры в несжатом и в сжатом виде. Это позволяет широко применять такие файлы в современных консолях Play Station 3 и Xbox360.

Как открывать файлы DDS

Если вас интересует, как открыть dds файл с целью «просто посмотреть, что там внутри», то достаточно будет обычной программы-конвертера.

Очень удобно для этой цели приложение Right Click Image Converter, с помощью которого за несколько секунд можно конвертировать файл формата dds в , png и другие наиболее популярные форматы. Вам нужно будет просто щелкнуть правой кнопкой мышки по файлу и выбрать пункт “Convert to” (здесь надо будет выбрать необходимое расширение). Файл в выбранном формате будет сохранен в этой же папке.

Если вам надо редактировать файл dds или создать собственный, то можно воспользоваться, например, . Предварительно с ресурса developer nvidia com (предварительно пробелы необходимо заменить на точки) нужно загрузить NVIDIA Texture Tools для Фотошоп. Данный инструмент позволяет открыть файл dds и сохранить с тем же расширением. Для других программ, которые работают с графикой, разработаны свои фильтры, предоставляющие возможность просматривать файлы dds.

Ну а для того, чтобы полноценно работать с форматом dds в разных программах (в 3D-редакторах и других приложениях, обеспечивающих импорт/экспорт игровых моделей с текстурами), скачайте утилиту nVidia DDS Utilities – она доступна на сайте NVIDIA.

Итак, мы убедились, что открыть файл dds не так сложно – необходимо просто установить нужные приложения и фильтры к ним.

Опции DDS карт


Опции текстур с прозрачностью (альфа-каналом)

DXT3 для иконок и книг. В графе Mip-map надо выбрать NO (формат НЕ используется в Skyrim)
DXT5 лучшее качество для вещей и предметов, в графе Mip-map нужно выбирать All

Опции текстур без прозрачности:

DXT1 (статик, броня, оружие и так далее, в графе мип-мап нужно выбирать all)


Разновидности карт

Диффузная карта dds

Под этим определением понимается собственно сама базовая текстура, несущая информацию о поверхности и цвете.

Карта нормалей, префикс _n

Normal map - сделанная фильтром маска, сообщающая движку о перепадах неровностей на поверхности предмета. Добавляет текстуре объем.
- Формат карты высот и карты свечения, как правило, совпадает с форматом базовой текстуры, ее мипмаппинг так же.
- Для иконок, карт и книг OBLIVION НЕ нужна карта высот.
Информация в карте высот о цветах и узорах не читается - только об освещенности. Эта карта - прозрачная маска с преломлениями и искажениями. Как линза поверх вашего рисунка. Это позволит вам на базе текстуры, сделав ее черно белой, устроить вручную любой перепад света перед фильтрацией, чтобы сделать вашу карту высот точнее, скрыть детали, которые не нужно отличать от нуля, и наоборот, подчеркнуть те места, где на обычной текстуре нет перепада, но он нужен.

Карта свечения, префикс _g:

Glow map - черно-белая текстура свечения с альфаканалом. Все, что светится - должно быть белым. Все, что не светится - черным.

Карта глянца/зеркальности, префикс _m:

Mirror map - карта, добавляющая поверхности глянец с эффектом отражения окружения. Черный цвет - матовая поверхность без бликов и отражений, белый - полный блеск. (аналогично альфа-каналу карты _n, употребляется, когда карты нормалей и карты высот имеют формат DXT1, а блеск надо регулировать, в основном, в Skyrim

Карта блеска, префикс _s:

Specular map - карта, отвечающая за матовость/блеск поверхности (практически не используется в Oblivion, распространена в Skyrim)

Работа с альфа-каналом

В диффузной карте цвет альфа-канала в градации от черного к белому (серые тона) означает прозрачность текстуры.
Черный: полная прозрачность (текстура в этом месте "отсутствует")
Белый: полная непрозрачность

В карте нормалей цвет канала в градации от черного к белому (серые тона) будет означать блеск поверхности. (В Скайриме вместо этого для текстур БЕЗ канала DXT1 делается карта _s)
Черный: полная матовость
Белый: полный блеск

Выполнение заливки канала в Photoshop

У вас должно быть активно окно channels (каналы).
Есть два способа выполнить нужную заливку канала или выделения в нем.
- Если канала еще нет, выделяем нужное место на текстуре, заходим в каналы, и внизу окошка жмем иконку Add Alpha (добавить альфа-канал)
- Если канал уже есть, заходим в него, выделяем нужный участок или весь канал, с активным инструментом Выделение правой кнопкой щелкаем по выделенному месту. Выбираем Выполнить заливку. В открывшемся меню выбираем Черный или Белый и выставляем проценты.

Назначение прозрачности модели в Nifscope

Правой кнопкой про объекту - Node - Attach Properties - NiAlphaProperty

Примеры


Стекло
- модель с разрешением использовать прозрачность и с текстурами dds и _n.dds
- альфа-каналы залиты соответвенно ~50% и 20% черного .
Прозрачность и блеск.

Кожа
- 100% белого канал dds
- 80% черного канал _n.dds
Непрозрачная и с легким отливом

Лицо
- 100% белого канал dds
- 90% черного канал _n.dds
Матовая плотная поверхность

Вырезание элемента
- 100% черного в границах элемента в канале alpha диффузной карты (основной текстуры)

Яркий блеск
- 20% черного в канале alpha карты нормалей _n.dds

Ошибки при использовании плагина NVIDIA DDS

Распространенная ошибка Too many channel означает, что вы не выполнили сведение. Зайдите в столбец слоев, кликните правой кнопой по любому из них и выберите в выпадающем меню "Выполнить сведение" (flatten image).
- Отказ в сохранении даже при сделанном сведении означает, что размер вашей текстуры имеет нечетное значение. Стороны текстур должны быть четными. В идеале, сторона текстуры должна быть кратна 4: 64х64, 128х128, 256х256, 516х516 и так далее.

Советы текстурщикам

Многие полагают, что им надо рисовать металл или тряпку руками и впадают в ступор. На деле, необходимо использовать кисти и фотоматериалы для базы - никто вас за это не поколотит. Будет особенно чудно, если для базы текстуры вы воспользуетесь собственным цифровым аппаратом. Если нет - воспользуйтесь теми текстурами, что можете скачать в сети и потом отделайте их.

Самое приятное, если вы сможете нарисовать текстуру сами. Для этого можно воспользоваться многочисленными уроками.

Советую поступить так: найдите фактурную текстуру, скажем ткани. Повысьте контраст, снимите с нее кисть. Теперь у вас есть штамп участка ткани, которым вы можете выделять на текстуре одежды какие-то места.
Я делала бесшовную текстуру, тщательно изучив фотографию реконструктора в кольчуге. Выбрав ровное место сплетения, я отрезала крошечный квадратик. Потом вам кистью придется аккуратно подгонять его так, чтобы при многократном повторе он образовывал большое ровное без швов поле. Это требует опыта, и главное - участок должен быть очень ровно освещен.

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

Достичь многих эффектов можно с помощью стилей и экшенов фотошопа, применяя их выборочно к отдельным участкам. Так можно сделать золото и серебро, например, камни и множество других вещей. Паттерны (бесшовные текстуры) тоже вам очень помогут. Скачать это все в сети не проблема. Со временем у вас останутся самые нужные вещи. У меня около 300 кистей и 200 паттернов, а так же около 50 Гб текстур, 6000 градиентов, 1500 стилей... в общем - вооружите свой фотошоп. Включите мозги и руки - создавайте свои текстуры, кисти, стили, паттерны, делайте их неповторимыми.

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

Сначала разберёмся с понятием канала. Каждый канал представляет одну составляющую цветовой модели. Каждое пиксельное изображение представляет собой набор каналов, число которых соответствует числу составляющих цветовой модели. Если исходить из этого определения, то получается, что в зависимости от цветовой модели изображения, число каналов в каждом изображении различно. И это действительно так. Например, в цветовой модели RGB только три канала, по одному на каждый основополагающий цвет - Красный, Зеленый и Синий. В цветовых моделях HSB и Lab тоже по три канала (H, S, B и L, a, b). А в цветовой модели CMYK четыре канала, по числу основополагающих цветов - Голубой, Пурпурный, Желтый и Черный. В изображении, основанном на цветовой модели Grayscale (Градации серого) всего один канал. По одному каналу имеют также Bitmap (Битовый формат), Duotone (Дуплексы) и изображения с Indexed Color (Индексированные цвета).

Все эти каналы называются цветовыми. Они предназначены для хранения цветовых параметров каждого изображения. Цветовые каналы создаются автоматически при создании изображения согласно выбранной цветовой модели. Все изменения на изображении немедленно фиксируются в соответствующих цветовых каналах.

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

Кроме основных цветовых каналов в приложении Adobe PhotoShop можно создавать дополнительные каналы. Общее число каналов не может быть больше 24. Дополнительные каналы называются альфа-каналами (alpha channels). Каждой точке каждого канала соответствует 8 бит данных, или на каждый пиксель каждого канала (за исключением черно-белого штрихового изображения) отводится по одному байту. Отсюда можно сделать вывод, при работе с изображением не рекомендуется создавать много альфа-каналов, так как это ведет к увеличению объемов файла.

Для работы с каналами предусмотрена специальная палитра Channels (Каналы). Для включения или выключения каждой строки в палитре Channels (Каналы) имеется специальный значок в виде открытого глаза (). Этот значок располагается в специальном поле, которое расположено в левой части каждого канала или режима. Наличие этого значка говорит о том, что данный канал или режим включен и видим. Отсутствие значка «глаза» говорит о том, что данный канал или режим выключен и его не видно на изображении. Одновременно все цветовые каналы и режим отключить невозможно, так как хотя бы один канал обязательно останется включенным и активным.


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

Исключением из этого правила добавления одного совмещенного канала являются два цветовых режима - Grayscale (Градации серого) и Indexed Color (Индексированные цвета). В этих моделях всего один канал, поэтому этот единственный канал в любом случае будет являться совмещенным. При работе с этими моделями просто нет смысла создавать копию этого же единственного канала.

Альфа-каналы (alpha channels) нужны, прежде всего, для хранения выделений на изображении. Например, создали Вы выделение. Проработали с ним. Затем пришлось выполнить операцию вне этого выделения. Затем снова пришлось вернуться к предыдущему выделению. Но сделать этого невозможно в принципе: нельзя с точностью до 1 пикселя выделить два раза одно и то же. Как бы Вы не выделяли, это выделение будет хотя бы немного, но другое. Поэтому создав сложное выделение, его можно сохранить в альфа-канале, а затем использовать это выделение не только в этом изображении, но и во всех изображениях.

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