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

Файлы.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.

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

Сначала разберёмся с понятием канала. Каждый канал представляет одну составляющую цветовой модели. Каждое пиксельное изображение представляет собой набор каналов, число которых соответствует числу составляющих цветовой модели. Если исходить из этого определения, то получается, что в зависимости от цветовой модели изображения, число каналов в каждом изображении различно. И это действительно так. Например, в цветовой модели 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 формате.

Загрузка сжатых текстур из файлов формата 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.

На этом всё.

Лирика:

Все текстуры для игр от Bethesda, и, в частности, Skyrim представлены в формате .dds . Этот формат может содержать внутри себя несколько размеров одной и той же текстуры. Любой размер текстуры использовать нельзя, только: 8 , 16 , 32 , 64 , 128 , 256 , 1024 , 2048 и так далее. Все ресурсы запакованы в .bsa архивы с соответствующими названиями. Текстуры ещё называют картами. Каждая диффузная карта (цветная текстура) сопровождается, как минимум, картой нормалей - normal map , исключение составляют текстуры для эффектов и им подобные. Про карты нормалей хорошо написано на Вики . Если говорить коротко, то карты нормалей позволяют низкополигональной модели выглядеть высокополигональной, добавляя всякие мелкие впуклости и выпуклости, и ещё она сиреневая и имеет маркер _n (имя текстуры_n.dds) или, теперь ещё, _msn , так что, при её идентификации ошибиться невозможно. Есть ещё карта свечения - glow map , которая определяет какие области на текстуре будут светиться, а какие - нет, имеет маркер _g . А так же, исключительно для Skyrim, введена новая карта - маска глянца, имеет маркер _m , определяет, при её использовании (то есть, если её не добавлять, то глянца не будет вообще нигде на модели), какая часть текстуры будет отражать окружение и в какой степени. Движок Обливион сам находит и подгружает правильно маркированные карты, а, вот, для Скайрима нужно вносить все карты в модель принудительно, причём каждую в свой, специально для неё предназначенный слот. Вот, в общем то, и всё.

Инструментарий:

1. Adobe Photoshop
2. Плагин для Фотошопа от Nvidia для работы с форматом.dds и созданием карт нормалей.
3. Какой-нибудь распаковщик.bsa архивов. Например [b]BSA Browser
by Fawzib Rojas .
4. Важно! Прямые руки.
5. Немножко знать английский язык. Совсем чуть-чуть.

Практика:

Предполагается, что Фотошоп уже установлен, и мы умеем с ним более-менее сносно общаться.
Ставим плагин NVidia , он добавит способность Фотошопу работать с.dds форматом и пункт в меню Filter -> NVIDIA Tools -> NormalMapFilter .
Чтобы извлечь текстуру из BSA-архива , откроем скачанный BSA Browser , в нём откроем (Меню -> File -> Open...) нужный нам BSA-архив (Путь до папки Skyrim\Skyrim\Data\Skyrim - Textures.bsa ), выделим нужные нам файлы и извлечём их. Данный распаковщик предлагает два варианта извлечения: в произвольную папку (Меню -> Action -> Extract To ...) или сразу в папку Data (Меню -> Action -> Extract). Иерархия папок, в обоих случаях, будет создана автоматически.
Открываем текстуру в Фотошоп. При открытии, плагин поинтересуется настройками чтения в таком окне:


Лучше отметить всё так, как на изображении, кроме последней галки, тут на ваше усмотрение: хотите каждый раз видеть это окно, оставляйте галку, не хотите - убирайте. Пункт Load MIP Maps отвечает за открытие всех или одного размера текстуры, рекомендую выключить его. Все размеры нам открывать не нужно, они автоматически сгенерируются при сохранении текстуры.
Изменяем текстуру. Этот пункт я сейчас не буду разворачивать, нас интересуют только настройки.
Теперь сохраняем . Тут немножко посложнее окно выскочит:


Разберём его поподробнее:
Верхний выпадающий список содержит настройки оптимизации и наличие\отсутствие альфа-канала и его тип. Все пункты нас не интересуют, только 4

DXT1 RGB - его выбираем для всех текстур без альфа-канала
DXT5 ARGB - для всех текстур с альфа-каналом
8.8.8 RGB - сохранение без сжатия и альфа-канала
8.8.8.8 ARGB - без сжатия с альфа-каналом

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

Generate MIP Maps - с доп. размерами (самый распространённый вариант)
Use Existing MIP Maps - выбрать доп. размеры самостоятельно
No MIP Maps - без доп. размеров

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

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: