Итак, я использую C ++ с OpenGL, и я собираюсь создать загрузчик для загрузки текстур для моей 3D-игры. (Но текстуры 2D). Я хочу вариант прозрачности, даже если я решу не использовать его. Мне нужно достойное качество, хотя оно не должно быть на высшем уровне. Что вы, ребята, предлагаете для формата (PNG, TGA и т. Д.). Также, возможно, сделайте что-то, для чего легко создать загрузчик (я не собираюсь использовать уже созданный.). А также, если у вас есть какие-либо ссылки / советы, чтобы помочь с загрузчиком, это будет оценено.
13
Формат текстуры изображения - это тоже выбор производительности. Я рекомендую вам использовать сжатые текстуры как можно больше. На мобильных платформах это может значительно повысить производительность (40% и даже больше), использование памяти и время загрузки.
Рассмотрим текстуру 1024 * 1024:
В наших играх у нас есть ресурсы (текстуры) во многих форматах:
Наконец, мы используем сырой формат для совместимости, но это для совместимости или элементов графического интерфейса
Текстуры ETC1 не имеют альфа-канала, поэтому мы используем специальный шейдер с двумя текстурами (текстура rgb и текстура альфа). Сжатый формат очень легко загрузить (100 или 200 лок).
На рабочем столе DXTC (S3TC) присутствует на многих картах. Итак, вы должны его использовать.
Сжатые текстуры
профессионал
Против
источник
Текстуры - это коллекции одного или нескольких изображений. Это означает, что текстура может быть представлена 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 выигрывает в плане всесторонней поддержки текстур.
источник
Группа Khronos рекомендует формат файла KTX для хранения текстур для приложений OpenGL и OpenGL ES. Вы можете использовать libktx для работы с этим форматом.
Функции:
источник
Похоже, что DDS (DirectDraw Surface) в настоящее время является наиболее популярным выбором для текстур. Имеет различные форматы пикселей, прозрачность и сжатие. Он поддерживается в OpenGL через расширение GL_ARB_texture_compression.
Например, есть загрузчик OpenGL здесь .
источник
Здесь есть ряд соображений:
TGA - хороший выбор, потому что в 24- и 32-битных несжатых случаях вы можете считывать данные в одном фреде / что угодно и отправлять результат напрямую через glTexImage2D без дальнейшей обработки. Это плохой выбор, потому что он может иметь самый большой размер файла, и если дисковый ввод / вывод является узким местом, то ваше чтение будет медленным.
PNG - хороший выбор, потому что он сохраняет качество изображений при относительно небольшом размере файла. Это плохой выбор, потому что PNG могут медленно распаковываться - если это ваше узкое место - ну, вы знаете.
JPG - хороший выбор, потому что он обычно имеет наименьший размер файла и очень быстро сходит с диска (вдвойне хорошо, если вам нужно отправить файл по сети). Это плохой выбор из-за промежуточных шагов распаковки программного обеспечения и потери качества (хотя вы можете настроить параметры качества, чтобы уменьшить это). Альфа-канала тоже нет.
DDS (или другие сжатые форматы) являются хорошим выбором из-за меньшего размера файла и возможности включать предварительно построенную цепочку mipmap. Если это формат, который изначально поддерживается аппаратно (а DDS изначально поддерживается на большинстве потребительских ПК-устройств - тоже долгое время), то вы получаете то же преимущество, что и TGA - один фред, немного суетесь в заголовке, чтобы выяснить это. некоторые свойства изображения, а затем отправить данные прямо без промежуточных шагов. Сжатые текстуры также заставят вашу программу работать быстрее и использовать меньше видеопамяти. Это плохой выбор, потому что они используют сжатие с потерями (которое иногда может быть действительно заметным) и могут поддерживаться не на всех аппаратных средствах.
Если бы это был я, я бы построил поддержку всех 4-х этих форматов (для TGA и DDS довольно просто писать загрузчики, для JPG и PNG я бы использовал библиотеку изображений), чтобы создатели контента могли выбрать наиболее подходящий формат для на основе текстуры.
источник
И, конечно, вы всегда можете использовать старый 32-битный BMP, который действительно легко загрузить (особенно, если размер равен степени 2 (фактически, кратно 8-байтовому значению IIRC)).
В противном случае кажется странным, что вам нужен только один формат, jpg действительно хорош для хороших реальных текстур с высоким разрешением (jpeg поражает дисковым пространством и временем загрузки), png для прозрачности и случайные 32-битные BMP для контрольных текстур (легко создать из скрипта или «быстрого и грязного» инструмента).
источник