Каков оптимальный размер текстуры?

12

Недавно я добавил в свой проект упаковщик текстур, который будет упаковывать определенное количество текстур в одну, например:

Упакованная текстура

Так, например, этот размер составляет 582x1023 пикселей. Целью добавления этих упакованных текстур, очевидно, было повышение производительности, поэтому я хотел найти оптимальный размер текстур для текстур OpenGL (используя LWJGL). Я обнаружил, что максимально поддерживаемый максимальный размер текстуры составляет 1024x1024, в соответствии с этим, например. Это кажется мне странным, потому что очевидно, что многие текстуры сами по себе будут больше, так что же будет с ними? Я уверен, что большинство видеокарт поддерживают текстуры больше, чем это. Могу ли я разумно ожидать, что большинство видеокарт будут обрабатывать, например, текстуры 4096x4096 (или, может быть, даже больше)?

Подходя ко второму пункту (я надеюсь, что это все еще считается одним вопросом, но это сводится к одной и той же проблеме): должны ли размеры текстур иметь степень 2 (256x256, 512x512, 1024x1024, 2048x2048, ..) и должны Я набил упакованные текстуры меньше, чем до следующей степени 2? Согласно этому вопросу от 2011 года, это не является обязательным требованием, но может улучшить производительность и избежать незначительных ошибок, и этот вопрос от 2012 года говорит о том, что вам определенно следует дополнять текстуры. Таким образом, я понимаю, что эти вопросы задавались ранее, но они имеют разумную дату, чтобы ответы изменились, и, кроме того, каждый из них лишь частично отвечает на мой вопрос. Как другие проекты / справиться с этим?

TL; DR: Какие размеры текстур я могу ожидать от большинства видеокарт? Каковы оптимальные размеры текстуры (или есть)? Должен ли я увеличить ширину текстур до следующей степени 2?

flotothemoon
источник
4
Графический процессор работает только со степенями 2. Если вы вручную не дополняете свои текстуры, то графический процессор (или ваш игровой движок) делает это за вас, что приводит к небольшой задержке во время выполнения для каждой текстуры, что может сложиться. Однако я не могу предложить никакой помощи по максимальным / оптимальным размерам текстур.
Кетура
@ketura Ах, я вижу, спасибо. Скажем, у меня есть изображение 513x10. Будет ли быстрее заполнить его размером 1024x1024 и затем передать все эти пустые пиксели или позволить графическому процессору сделать это?
flotothemoon
4
Вам не нужно будет идти так высоко. 1024 х 16 будет работать; это не должно быть КВАДРАТНО, только сила 2 в каждом направлении. Хотя в этом случае я бы серьезно подумал, не смогу ли я сэкономить пиксель и довести его до 512x16, смеется.
Кетура

Ответы:

6

Я собираюсь попытаться ответить на это, хотя YMMV. Я использую обзор оборудования Steam ( http://store.steampowered.com/hwsurvey?platform=pc ), чтобы определить, какая видеопамять (VRAM) доступна на большинстве компьютеров. Если посмотреть на результаты 2015-10-13 (сегодня), то почти 85% людей имеют 1024 МБ видеопамяти.

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

Предполагая, что 32 бита цвета + альфа на пиксель, то есть 4 байта на пиксель, 1 ГБ видеопамяти может максимально удерживать ~ 256 миллионов пикселей. Это соответствует 256 1К на 1К текстур. Это предполагает (неверно), что вы хотите хранить только текстуры в вашей VRAM, в то время как будет целый ряд других вещей (например, данные сетки, если вы работаете в 3D), для которых вам нужно оставить место. Вы также, вероятно, захотите выделить больше места для отображения текстур с помощью mip, что обычно работает лучше всего, если ваши текстуры имеют степень двойки.

Современные консоли (XBOX One и PS4) имеют 4–8 ГБ унифицированной оперативной памяти, большинство карманных компьютеров и мобильных устройств имеют 1–2 ГБ унифицированной оперативной памяти с ограничениями того, сколько вы можете выделить как VRAM.

Я бы обычно создавал текстуры 2K, чтобы они работали на большинстве ПК, позволяя уменьшить масштаб для устройств более низкого уровня. Если вы пишете 2D-игру и хотите использовать дисплеи с более высоким разрешением (4K, Retina iPad и т. Д.), Вы можете использовать 4K-текстуры для фона, но для большинства других частей это может быть излишним.

Надеюсь, что это помогло и не испортило воду.

Виджай Варадан
источник
Спасибо за ответ, определенно помогает. Что касается широты, извините за это, забыл указать некоторые детали: я занимаюсь разработкой для ПК в 2D. Что произойдет, если вы будете использовать текстуры, размер которых превышает максимальный поддерживаемый размер текстуры? Это не работает вообще или просто становится медленнее?
flotothemoon
1
Похоже, мой ответ был точным. Проверка других сообщений на форуме сайта 2k текстуры - это то, что вы должны поддерживать, чтобы ваша игра работала на большинстве устройств. Предел размера текстуры зависит от конкретного оборудования и конкретной версии OpenGL-ES. Я не уверен, каким будет конкретное сообщение об ошибке, но оно придет из OpenGL-ES при попытке загрузить текстуру. Полезные ссылки: answers.unity3d.com/questions/563094/… , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 и feedback.wildfiregames.com/report/opengl/feature/…
Виджай Варадан
Когда я пытаюсь загрузить или пытаться связать текстуру? Или это то же самое здесь?
пятница