Дело о пропавшем нормале.

Но черт возьми, Холмс, как??!

Логика подсказывает, что только сохранение нормалмапа в несжатый формат ARGB 8888 (8bpp - 8 бит на пиксель на каждый канал) сохранит все детали и не внесет артефактов компрессии в текстуру. Примером может служить старый *.bmp формат. Но за это приходится расплачиваться размером. Причем не только на жестком диске, но и в видеопамяти видеокарты. А что не влезает в видеопамять - гоняется между ней и основной оперативной памятью по PCI-E шине, что как бы намного медленнее, чем если бы текстура хранилась в видеопамяти. Без сжатия текстура весит (для 2к например) 2048 (ширина) * 2048 (высота) * 4 канала (для ARGB) * 8 bpp = 16 мегабайт. Текстур таких может быть сотни, а видеопамять не резиновая и ограничена ныне 512-1024 мегабайтами (есть и меньше, но это уже каменный век, 512 для современных игр как минимум).

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

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

Создатели же модов лишены всяких ограничений и вольны использовать даже не сжатые текстуры. Не велика нагрузка от пары мечей или уникального доспеха. Но наступает предел, когда и современная видеокарта, о которой даже и не мыслили 2-3 года назад (когда создавался движок) тихо захлебнется под грузом мода :). И вот тут приходится текстуры сжимать и упрощать высоко полигональные модели.

Чем сжимать? Вариантов несколько:

Первые два сжимают практически идентично и на мой взгляд качественнее остальных. У пеинт.нета вариантов выбора настроек меньше и качество похуже.

Итак, дело о пропавшем качестве нормала при сжатии в DDS, оригинал выглядит следующим образом:

DXT1
RGB, 4 bpp (Bits Per Pixel), без альфа-канала или с 1-битным альфа-каналом. Сохраняет с компрессией 8:1.

(Чем ярче Difference - тем сильнее отличается результат компрессии от оригинала, яркость для наглядности увеличена в 2 раза)
DXT1 / Difference / Final

DXT3
ARGB, 8 bpp. Сохраняет с компрессией 4:1, однако у компрессии альфа-канала такая интерполяция, что реально можно подумать о выделении на альфа-канал только 4 бит (16 градаций яркости) вместо 8. Подходит для объектов с достаточно жесткими границами прозрачности. Разница в сжатии RGB-каналов в сравнении с DXT1 в лучшую сторону.

DXT3 / Difference / Final

DXT5
ARGB, 8 bpp. Сохраняет так же с компрессией 4:1, но альфа-канал более подходящий для плавных градиентов прозрачности. Но речь не о нем. Разницы в сжатии RGB-каналов между DXT3 и DXT5 нету.

Это самые распространенные варианты из применяющихся. Но результат компресии удручает, поэтому твикаем. При сохранении надо выбрать пункт "Image options" и там поставить галку "Error Diffusion".

DXT5 + Error Diffusion / Difference / Final

Это внесет в текстуру шум. Этот вариант лучше подойдет для больших сглаженных областей, без шума артефакты сжатия видны резче. А шум хоть немного ухудшает текстуру, делая ее более шершавой, зато скрывает блочность. Следующий вариант без "Error Diffusion", но с выбором типа изображения "Normal Map: Tangent Space" вместо "Color".

DXT5 + NM:TS / Difference / Final

И вариант "Error Diffusion" + "Normal Map: Tangent Space".

DXT5 + NM:TS + Error Diffusion / Difference / Final

На мой взгляд "Error Diffusion" мало когда нужен, а вот выбор "Normal Map: Tangent Space" при сохранении карт нормалей оправдан.

Бесплатный редатор Paint.Net так же может сохранять текстуры в DDS формат. Однако беспокоится о разнице в качестве результата не нужно. Да, в мелких деталях есть различие, но говорить о превосходстве качества компрессии Paint.Net или Photoshop + nVidia Normal map filter над конкурентом нельзя. Характер и сила создаваемых артефактов аналогичные. У редактора Paint.Net возможность сохранения только базовых форматов dds - DXT1, DXT3, DXT5, ARGB 8888, ARGB  1555, ARGB 4444, RGB 888, RGB 555. Впрочем большинству других и не нужно :).

А в nVidia Normal map filter существует еще несколько вариантов сохранения, но они редко используются.

DXT5_NM
XY, 8 bpp. Сохраняет Х-координату (красный канал) в альфа-канал, а Y-координату (зеленый канал) в зеленый канал, красный и синий канал отображаются точно так же как зеленый, но хранятся в виде одного цвета . Вариант неплохой, но надо смотреть, поймет ли конкретный движок подобную текстуру. Теоретически должен распознать. Минус в отсутствии альфа-канала для текстуры спекуляра. Очень похоже что используется игрой Dragon Age: Origins (или VU, они похожи по внешнему виду, я не копал детали). На скриншоте Difference виден контур отсутствующего синего канала, но качество сжатия в плане деталей на высоте.

DXT5_NM / Difference / Final

3Dc
XY, 8 bpp. Разработан еще в ATi, а начиная с DirectX 10 стандартизирован как BC5. Пожалуй самый подходящий вариант для нормала, но результат вдвое светлее оригинала из-за того, что сохраняется половина "глубины", но это я думаю решается шейдером материала. Зато результат сохранения качества не отличается от DXT5_NM при более привычном виде. Альфа-канал к сожалению тоже отсутствует. Кстати рекомендуется (из-за скорости обработки непосредственно в движке) для сохранения текстур нормалей камрадами из nVidia и id Software :) "Real-Time Normal Map DXT Compression" J.M.P. van Waveren (id Software, Inc.), Ignacio Casta?o (NVIDIA Corp.).

Так что это скорее формат будущего, а не настоящего.

3Dc / Difference / Final

Если вручную подогнать по яркости результат 3Dc до яркости как в оригинальной текстуре, то можно получить результат мало чем отличающийся от не сжатого нормала (это и должен движок делать). Конечно есть артефакты, но разница в размере в 4 раза стоит этого. К примеру или сохранить не сжатую текстуру или увеличить размер вдвое (например с 2048*2048 до 4096*4096, что позволит сохранить больше мелких деталей).

Original / 3Dc

И еще раз. В DirectX 10 сие стандартизировали как DXT BC5. В DirectX 11 добавили дополнительно еще два BC6 или еще называется BC6H (HRD, 6:1 compression, 16bpc RGB) и BC7 (LDR with alpha, 3:1 compression RGB или 4:1 RGBA). 43-я страница NVISION08-Direct3D_11_Overview.pdf. Результат впечетляет.

На этом варианты компрессии заканчиваются. Все остальное (кроме разумеется не компрессированного ARGB 8.8.8.8) надо применять только если это указано для конкретных ситуаций, для конкретного движка.

Paletted DDS textures
Аналог GIFа: 16 colors (RGB 4 bpp), 256 colors (RGB 8 bpp), 16 colors + alpha (ARGB, 4 bpp), 256 colors + alpha (ARGB, 8 bpp).

Bit Reduction
Компрессия за счет уменьшения количества бит на канал: 5.5.5 (RGB, 16 bpp), 5.6.5 (RGB, 16 bpp), 1.5.5.5 (ARGB, 16 bpp), 4.4.4.4 (RGB, 16 bpp).

Не компрессированные текстуры
8A/8L - RGB преобразуется в оттенки серого + 1 канал альфа или яркость (Luminance).
8.8 (16 bpp) - два любых 8-битных канала.
AL - альфа + яркость (luminance).
VU - 2 канала, аналогично 8.8, только сохраняются красный и зеленый каналы, а синий заливается белым. Фактически именно этот формат раньше рекомендовался для сохранения текстуры нормалей, но отсутствует компрессия. По внешнему виду соответствует 3Dc.
8.8.8 (RGB, 24 bpp) - не компрессированный RGB.
8.8.8.8 (ARGB/QWVU, 32 bpp) - не компрессированный ARGB для текстур с альфой.
16.16 (GB, VU, 32 bpp) - 2 канала с 16 битами на канал (65536 градаций яркости) вместо 8 бит на канал (256 градаций яркости)

HDR-текстуры:
16f, 16.16f, 16.16.16.16f, 32f, 32.32.32.32f - используют 16 или 32 битное число с плавающей запятой (типа +1,568456214*10^3) на пиксель для каждого канала.