Лучший (самый популярный?) Формат изображения для текстурирования [закрыто]

13

Итак, я использую C ++ с OpenGL, и я собираюсь создать загрузчик для загрузки текстур для моей 3D-игры. (Но текстуры 2D). Я хочу вариант прозрачности, даже если я решу не использовать его. Мне нужно достойное качество, хотя оно не должно быть на высшем уровне. Что вы, ребята, предлагаете для формата (PNG, TGA и т. Д.). Также, возможно, сделайте что-то, для чего легко создать загрузчик (я не собираюсь использовать уже созданный.). А также, если у вас есть какие-либо ссылки / советы, чтобы помочь с загрузчиком, это будет оценено.

Брэндон Оубиуб
источник

Ответы:

15

Я не понимаю, почему вы не захотите использовать готовый загрузчик. Например, PNG является хорошим выбором для формата, но он сложен для написания загрузчика общего назначения (и, вероятно, не стоит усилий для написания загрузчика, который загружает только определенное подмножество форматов PNG, которые вам интересны).

Учитывая это несколько необычное требование, TGA , вероятно, ваш лучший выбор. TGA 2.0 имеет альфа-канал и относительно прост по сравнению с PNG.


источник
3
+1 за ТГА, если ОП хочет написать свой. Я написал свой собственный загрузчик TGA один раз. Так быстро и безболезненно.
Коммунистическая утка
4
@Duck: безболезненно, пока вы делаете простые TGA без сжатия или каких-либо необычных функций. Если вы хотите полностью совместимый TGA-загрузчик, я обнаружил, что это немного больно. Это своего рода странный формат.
ZorbaTHut
1
@ Zorba, сжатие достаточно просто. Это просто, если вы заботитесь о расширениях или нет.
замедленная
10

Формат текстуры изображения - это тоже выбор производительности. Я рекомендую вам использовать сжатые текстуры как можно больше. На мобильных платформах это может значительно повысить производительность (40% и даже больше), использование памяти и время загрузки.

Рассмотрим текстуру 1024 * 1024:

  • RGB или RGBA (16 бит): 2Mo (0,5 с для загрузки на SGS)
  • RGBA (32 бита): 4Mo (1 с для загрузки на SGS)
  • PVRT (4bpp): 512ko (125 для загрузки на SGS)
  • ETC1 + Alpha: 1.5Mo (.4 с для загрузки на SGS)

В наших играх у нас есть ресурсы (текстуры) во многих форматах:

  • Формат DDS для текстур DXTC (настольные платформы: OS X, Linux, Windows и Tegra)
  • Формат DDS для текстур ATC (графические процессоры Andreno)
  • Формат PVR для формата PVRT (графические процессоры PowerVR)
  • Формат PKM для текстуры ETC1 (совместимы со всеми устройствами OGLES 2.0)

Наконец, мы используем сырой формат для совместимости, но это для совместимости или элементов графического интерфейса

  • Формат PNG для необработанных текстур. Это для текстур RGBA 16, 24 или 32 бита (мы используем лицензионный загрузчик MIT). Это несжатые текстуры.

Текстуры ETC1 не имеют альфа-канала, поэтому мы используем специальный шейдер с двумя текстурами (текстура rgb и текстура альфа). Сжатый формат очень легко загрузить (100 или 200 лок).

На рабочем столе DXTC (S3TC) присутствует на многих картах. Итак, вы должны его использовать.

Сжатые текстуры

профессионал

  • Улучшена скорость заполнения текстуры
  • Загрузка текстуры (4x или больше)
  • Легко загрузить

Против

  • Не поддерживается на всех платформах
  • артефакты
Эллис
источник
6
Существует большая разница между текстурами, которые сжимаются на видеокарте (например, DXTC), и текстурами, которые сжимаются только во время хранения и должны быть распакованы во время загрузки (например, PNG). PNG будет загружаться медленнее, чем несжатая текстура, потому что сначала она должна быть распакована. Да, они имеют меньший размер файла, но объем используемой графической памяти одинаков.
Джоккинг
8

Текстуры - это коллекции одного или нескольких изображений. Это означает, что текстура может быть представлена ​​TGA или PNG, но ни один из форматов не способен отображать все возможные свойства текстур. Почему?

Потому что каждый может содержать только одно изображение. Здесь нет мипмапов. 3D-текстуры невозможны. Нет массива текстур. Нет кубов. Каждый из этих файлов представляет собой одно изображение 2D. Они могут быть частью текстуры, но если вы не используете mipmapping (и я настоятельно рекомендую не использовать mipmaps, если у вас нет особых потребностей), один файл изображения в этих форматах не может быть текстурой.

Это хорошие форматы изображений, но они создают плохие форматы текстур .

DDS является лидером форматов текстур, потому что он на самом деле поддерживает потребности текстур. Он поддерживает MIPMAP и CubeMAP. Поддерживает 3D текстуры. DDSv10 поддерживает текстуры массива. Вы можете упаковать одну текстуру в DDS так, как вы не смогли бы использовать PNG или TGA.

DDS поддерживает несжатые и сжатые данные текстуры. Пока формат сжатых текстур является одним из форматов текстур DXT / BC.

PKM полезен для упаковки сжатых ETC1 изображений, но, как и в PNG, он не поддерживает фактические функции текстур.

Файлы PVR кажутся мобильным эквивалентом DDS (хотя, почему они не могли просто использовать DDS, я не знаю). Они поддерживают различные методы сжатия, но им не хватает продвинутых функций DDSv10, таких как текстуры массива, а также поддержка 3D-текстур.

Таким образом, DDS выигрывает в плане всесторонней поддержки текстур.

Николь Болас
источник
2
Говоря исключительно о функциях, TIFF поддерживает все, что делает DDS и многое другое. Хотите текстуру с дальним ИК, ближним ИК, R, G, B и УФ каналами в дополнение к альфа-каналу? В 64-битной IEEE с плавающей точкой на канал? Сжат ли какой-либо из нескольких алгоритмов (включая JPEG и JPEG2000) как подходящие для канала? С несколькими изображениями в файле и богатыми метаданными для каждого из них? Он может сделать все это и даже больше. Это также "родной" формат Photoshop с некоторого времени. Теперь, что касается написания загрузчика для него ...
Мартин Сойка
Позвольте мне добавить больше информации о требовании использования только формата текстур DXT / BC в контейнере DDS; Кажется, это не так. Я видел Compressonator, использующий различные форматы сжатия и выводящий его как .dds для всех (можно увидеть этот совет из справочного вывода при выполнении его cli) и [this] (ответ) на SO, говорящем, что вы можете использовать любой формат сжатия (устанавливая другой FourCC тогда справимся).
19
1
@haxpor: Вы можете засунуть в файл все, что захотите, и назвать его DDS. Вопрос в том, сможет ли приложение, которое может читать обычные файлы DDS, читать ваши или оно должно быть специально закодировано для этого? Формат DDS определяет только форматы сжатия DXT / BC (и я полагаю, ASTC в настоящее время). Что произойдет, если вы используете другой формат, если программа его напишет, а программа - его. Но это верно практически для любого формата изображения.
Никол Болас
@NicolBolas Спасибо, что подвели итоги. Я думаю, что это так.
haxpor
5

Группа Khronos рекомендует формат файла KTX для хранения текстур для приложений OpenGL и OpenGL ES. Вы можете использовать libktx для работы с этим форматом.

Функции:

  • Создание текстуры OpenGL из файла KTX
  • Распакуйте сжатый образ текстуры ETC1, если оборудование не поддерживает ETC1.
  • Построить хэш-таблицу пар ключ-значение из файла KTX при загрузке текстуры
  • Запишите файл KTX из массива исходных изображений и необязательной хэш-таблицы пар ключ-значение.
  • Создайте и заполните хэш-таблицу пар ключ-значение.
KindDragon
источник
3

Похоже, что DDS (DirectDraw Surface) в настоящее время является наиболее популярным выбором для текстур. Имеет различные форматы пикселей, прозрачность и сжатие. Он поддерживается в OpenGL через расширение GL_ARB_texture_compression.

Например, есть загрузчик OpenGL здесь .

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

Здесь есть ряд соображений:

  1. Как быстро вы можете получить текстуру с диска и в системную память.
  2. Как быстро вы можете получить текстуру из системной памяти на GPU (через glTexImage2D в вашем случае).
  3. Сколько места на диске и видеопамяти в вашем бюджете.
  4. Производительность и качество.

TGA - хороший выбор, потому что в 24- и 32-битных несжатых случаях вы можете считывать данные в одном фреде / что угодно и отправлять результат напрямую через glTexImage2D без дальнейшей обработки. Это плохой выбор, потому что он может иметь самый большой размер файла, и если дисковый ввод / вывод является узким местом, то ваше чтение будет медленным.

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

JPG - хороший выбор, потому что он обычно имеет наименьший размер файла и очень быстро сходит с диска (вдвойне хорошо, если вам нужно отправить файл по сети). Это плохой выбор из-за промежуточных шагов распаковки программного обеспечения и потери качества (хотя вы можете настроить параметры качества, чтобы уменьшить это). Альфа-канала тоже нет.

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

Если бы это был я, я бы построил поддержку всех 4-х этих форматов (для TGA и DDS довольно просто писать загрузчики, для JPG и PNG я бы использовал библиотеку изображений), чтобы создатели контента могли выбрать наиболее подходящий формат для на основе текстуры.

Максимус Минимус
источник
1
«DDS изначально поддерживается на большинстве потребительских ПК». DDS - это контейнер для разных форматов. Вы не передаете файл DDS в графический процессор, но его содержимое!
Тара
0

И, конечно, вы всегда можете использовать старый 32-битный BMP, который действительно легко загрузить (особенно, если размер равен степени 2 (фактически, кратно 8-байтовому значению IIRC)).

В противном случае кажется странным, что вам нужен только один формат, jpg действительно хорош для хороших реальных текстур с высоким разрешением (jpeg поражает дисковым пространством и временем загрузки), png для прозрачности и случайные 32-битные BMP для контрольных текстур (легко создать из скрипта или «быстрого и грязного» инструмента).

Valmond
источник