Чому текстури завжди квадратні потужності дві? Що робити, якщо їх немає?


53

Чому роздільна здатність текстур в іграх завжди має потужність дві (128x128, 256x256, 512x512, 1024x1024 тощо)? Хіба не розумно було б економити на розмірі файлу гри та зробити так, щоб текстура точно відповідала ультрафіолетовій моделі?

Що було б, якби була текстура, яка не була б потужністю два?

Чи було б неправильним, щоб текстура була на зразок 256x512 або 512x1024? Або це спричинить проблеми, які можуть викликати текстури без потужності двох?


9
Ваші інші приклади - також сили двох, тільки не одна і та ж сила двох. Потужність двох робить текстуру оптимізованою для графічного обладнання.
MichaelHouse

1
@ Byte56 Я думаю, що він має на увазі 2 ^ nx 2 ^ n текстури, де n варіюється від 1 до нескінченності. (Не дуже нескінченна.)
Робін

Також зауважте, що повноваження двох мають користь, роблячи мип-карти тривіальними.
Паббі

Оскільки текстура зазвичай загортається (хоча ви можете вибрати це у користувальницькій шейдері), вам не потрібно витрачати жодне місце, просто оберніть по краях полігони uv координати, і ви зможете набагато легше використовувати доступний простір. Якщо у вас немає нагальної необхідності, найбезпечніше дотримуватися її текстури з шириною = висота = 2 ^ n, оскільки це дозволить отримати більш широкий спектр обладнання за рахунок трохи складнішої верстки Uv.
Даніель Карлссон

Вони не завжди є силами двох.
Алмо

Відповіді:


49

Чому роздільна здатність текстур в іграх завжди є двома (128х128, 256х256, 512х512, 1024х1024 тощо)?

Як випливає з Byte56, обмеження розміру "потужність двох" є (такими), що кожен вимір повинен бути незалежно потужністю двох, а не те, що текстури повинні бути квадратними і мати розміри, які є потужністю двох.

Однак на сучасних картках та в сучасних графічних API це «обмеження» значно зменшено, так що розміри текстур можуть бути в межах розуму практично будь-чим, що вам подобається. Однак:

Хіба не розумно було б економити на розмірі файлу гри та зробити так, щоб текстура точно відповідала ультрафіолетовій моделі? Що було б, якби була текстура, яка не була б потужністю два?

Забезпечуючи розміри текстур, що мають потужність двох, графічний конвеєр може скористатися оптимізаціями, пов'язаними з ефективністю роботи з двома потужностями. Наприклад, можна (і зовсім кілька років тому, перш ніж ми виділили GPU та надзвичайно спритні оптимізатори компіляторів), швидше ділити та помножувати на дві потужності. Робота в повноваженнях двох також спрощених операцій в рамках конвеєра, таких як обчислення та використання mipmap (число, яке є потужністю два, завжди буде рівномірно розділене навпіл, а це означає, що вам не доведеться мати справу зі сценаріями, коли ви повинні обійти ваші розміри карти вгору або вниз).

Це правда, що ви «витрачаєте» деякий простір таким чином, але додатковий простір, як правило, вартує цього для компромісу у виконанні рендерінгу. Крім того, існують такі методи, як стиснення або упаковка декількох зображень в єдиний простір текстури, який може полегшити частину відходів зберігання.


11
"Це правда, що ви" витрачаєте "деякий простір таким чином, але додатковий простір, як правило, вартує цього для компромісу у виконанні рендерінгу". - Близько десяти років тому я працював у студії, яка переносила гру PS2 на XBox. У той час як PS2 технічно не підтримує текстури, що не мають потужності, ви можете в деяких випадках змусити це зробити трохи розумні маніпуляції та відсутність втрати швидкості. XBox, з іншого боку, повністю не підтримував їх. Кінцевий результат полягає в тому, що, незважаючи на те, що XBox майже вдвічі перевищував оперативну пам’ять PS2, нам довелося дещо пробити деякі текстури, щоб вмістити їх.
ZorbaTHut

Мені важко знайти цитування, але я раніше читав, що зображення JPEG повинні бути кратними 8 для максимальної ефективності, оскільки все, що знаходиться поза цим, все ще потребує блоку 8х8.
лосось

1
@salmonmoose: Правильно; JPEG стискає кожен блок розміром 8x8 незалежно і накладе блоки на край. Але це не пов'язане з цим питанням.
MSalters

1
JPEG-файли закодовані в 8x8 блоків, так. Однак це насправді не є ефективністю. І це не обов'язково потужність 2. :)
Kylotan

Приклад наводиться на Android, де часто текстури, які не є потужними, призводять до білих текстур.
користувач717572

17

Чому текстури завжди квадратні потужності дві?

Текстури не завжди є квадратними, а також не завжди двома . Причина, чому вони мають тенденцію бути двома повноваженнями, зазвичай полягає у підвищенні сумісності зі старими відеокартами, які наклали це обмеження. Що стосується не квадратних текстур, то це зазвичай не проблема. Узагальнити:

  • Текстури, як правило, не повинні бути квадратними, хоча у DirectX є D3DPTEXTURECAPS_SQUAREONLYможливість, але я працював з неквадратичними текстурами навіть у старій апараті без проблем.
  • Текстури мають бути двома, оскільки багато старих графічних карт все ще потребують цього. Причиною цього обмеження стало те, що вони могли виконати певні оптимізації операцій зі відображенням текстури. Більшість сучасних графічних карт також не мають цього обмеження.

12
Слід зазначити, що під "старими графічними картками" він має на увазі речі, виготовлені до 2006 року.
Нікол Болас

1
@NicolBolas Спасибі, я насправді намагався знайти деякі посилання на цю тему.
Девід Гувейя

7

Це стосується оптимізації відеокарт. Вони були розроблені, щоб обробити їх таким чином. Більшість карт в ці дні буде дозволить вам завантажувати текстури з розмірами, які не є ступенями двійки, але ймовірно , буде мати негативний вплив на продуктивність. Є хороший шанс, що коли він завантажується, це насправді буде перетворене, що коштує завантаження часу і не економить жодної пам'яті. Неквадратичні текстури, як правило, добре, якщо обидва їх розміри мають потужність дві.

Одним із способів поводження з фактурами непарного розміру є використання текстурного атласу . В основному ви розміщуєте кілька текстур разом в одну текстуру і використовуєте координати текстур вершин для посилання на потрібне зображення. Це також має додаткові переваги від продуктивності, оскільки це дозволяє уникнути змін у державі. Поширене використання цього полягає в розміщенні всіх елементів інтерфейсу в єдину текстуру, тобто, якщо ви об'єднали вершини інтерфейсів в один об'єкт буфера, ви можете намалювати всю справу за допомогою одного виклику, а не перемикання текстур багато разів і роблячи окремий дзвінок для кожного з них.


6

Проблема полягає в тому, що деяке обладнання має обмежену підтримку текстур, які не мають потужності двох вимірів.

Наприклад, подивіться внизу http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx та прочитайте там виноски 3 та 4.

3 На рівні функцій 9_1, 9_2 та 9_3 пристрій відображення підтримує використання двовимірних текстур розмірами, які не мають потужності двох при двох умовах. По-перше, може бути створений лише один рівень MIP-карти для кожної текстури, а по-друге, не дозволяються режими пробовідбору для текстури тексту (тобто члени AddressU, AddressV та AddressW D3D11_SAMPLER_DESC не можуть бути встановлені на D3D11_TEXTURE_ADDRESS_WRAP).

4 На рівні функцій 10_0, 10_1 та 11_0 пристрій дисплея беззастережно підтримує використання двовимірних текстур розмірами, які не мають сили двох.


6

Графічне обладнання оптимізоване для матричних операцій, операцій з фрагментами та векторних операцій. Простіше кажучи, квадратні матриці легше вирішувати, оскільки обчислення можуть здійснюватися в блоках (називаються фрагментами), апаратне забезпечення оптимізоване для блокових операцій, тому існують такі речі, як файлові буфери, а оперативна пам'ять не блискає на диску до блоку була заселена. Те саме стосується графічної пам'яті.

Буфер кадру складається з фрагментів, які є квадратними. Наприклад, на екрані з роздільною здатністю 800x600 та кольоровим простором RGB (0-255) є 800x600 точок з 3 байтами кожного каналу, загальна сума становить 3x800x600 = 1,440,000 байт для адреси в буфері кадру. Це означає, що є 1875 адресних фрагментів розміром 256x256x3 байт. Оскільки дані текстури є квадратними, це значно спрощує відображення від матриці GRAM до матриці буфера екрану за допомогою бікубічного масштабування, де як би це не було квадратне зміщення для більш тривалої сторони, знадобиться більше часу для обчислення, коли потрібно бути масштабним.

Багато графічних API приймають дані неквадратичної текстури, оскільки вони приймають координати ультрафіолетового відображення як дані з плаваючою точкою, однак після того, як вони будуть надіслані до GPU, до текстурних даних додається накладка, оскільки фактичні пропорції зображення не змінюють відображення здається, що це не стосується, однак додавання текстурних даних до текстурних даних додається, оскільки GPU любить адресувати її як ідеальний квадрат.

Отже, якщо використовується зображення розміром 100x1024 і використовується зображення 1024x1024, що означає 946,176 байтів. Тим більше, що для компонування потрібно робити, оскільки потрібно буде додати альфа-канал, щоб вказати, що дані прокладки не повинні впливати на текстуру композиції.


Це цікаве пояснення (титбіт про квадратні матриці), яке не зустрічається у звичайній силі 2 відповідей (+1) - чи могли б ви надати деякі цитати, якщо це можливо?
Самаурса

1

Наш цифровий світ працює з двійковою нумерацією, а потім для множення або ділення на 2 значення ви можете "перемістити" значення вліво або вправо, тобто

<<  Left shift      x = 5 << 1    0101 << 1     1010     10
>>  Right shift     x = 5 >> 1    0101 >> 1     0010      2

Робота зі значеннями "потужність двох" для процесора простіше.


0

Сучасна апаратура може (нарешті) впоратися з включенням режимів обгортання при неможливості використання двох текстур на основі, однак неможливість використання двох текстур все ще має тенденцію витрачати пам'ять графічного процесора, оскільки вони, як правило, заширюються по ширині деяким конкретним обладнанням (або до певного розміру плитки або закруглені до наступної потужності двох розмірів, що містить текстуру).

Оскільки це залежить від обладнання та постачальники, як правило, не вникають у специфіку цих деталей, найбезпечніше, що потрібно зробити, - це продовжувати використовувати потужність двох вимірів для текстур, щоб не витрачати таран GPU.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.