Скільки текстур зазвичай можна зв’язати відразу?


23

Я розробляю ігровий движок, і він працюватиме лише на сучасному (модель Shader 4+). Я вважаю, що до того моменту, коли я закінчу це, це не буде такою необгрунтованою вимогою.

Моє запитання: скільки текстур можна зв’язати одразу на сучасній графічній карті? 16 було б достатньо. Чи можна очікувати, що більшість сучасних графічних карт підтримують таку кількість текстур?

Моя версія GTX 460 підтримує 32, але я не маю уявлення, чи це представник більшості сучасних відеокарт.


Який API візуалізації ви використовуєте?
Адам

2
OpenGL звичайно :)
Avi

Відповіді:


53

Кількість текстур, які можна прив’язати до OpenGL, не становить 32 або 16 . Це не те, що ти отримуєш glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Ця функція отримує кількість текстур, до яких можна отримати доступ до фрагменту шейдера .

Дивіться, у кожного шейдера є своя межа кількості текстур, які він може використовувати . Однак є також загальна кількість текстур, які можна використовувати, періодично. Це визначено (у OpenGL) GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Отже, існують дві межі: текстури на етап і текстури - загальна кількість.

OpenGL 3.x визначає мінімальну кількість для граничного ступеня до 16, тому обладнання не може мати менше 16 текстур на етап. Він може мати більш високу межу, але ви знаєте, що ви отримаєте принаймні 16. 3.x визначає мінімальну кількість для текстур-загальної кількості, як 48. AKA: 16 * 3 етапи. Аналогічно, GL 4.x визначає числа, що мають 16 текстур на етап, і 96 текстур - загалом (тобто: 16 * 6 етапів, включаючи обчислювальні шейдери).

Знову ж таки, це мінімальні цифри. Апаратне забезпечення може (і дійсно) відрізняється.

Що стосується конкретного обладнання, ви можете очікувати, що будь-яке обладнання DX10 класу відповідає цим номерам. Устаткування класу DX11 має деяку дисперсію; NVIDIA (GeForce 4xx +) та більш чіткі AMD-чіпи (він же: GCN-ядра) можуть мати більше, ніж 16-ступінчастий.


2
Я б хотів, щоб це була прийнята відповідь. Врятувало б мене 5 хвилин безглуздого читання.
Fibbles

3

Я вважаю, що 32 - це максимальна кількість текстур, яка може бути пов'язана в даний час. Наскільки я можу сказати, навіть серія 8800 мала 32 текстурні одиниці.

Наскільки я знаю, для підтримки openGL 4.x вам знадобиться карта Fermi або новіша nvidia (або відповідна картка amd), у всіх верхніх кінцевих моделях є 32 одиниці, в той час як карти з найнижчим кінцем (GT 430, наприклад, ) Є 16. Однак, дивлячись на аркуші специфікацій AMD, вони перераховують номери, як 80 або 128 текстурних одиниць, але перелічують 32 кольорові одиниці ROP, які, здається, залишалися постійними протягом поколінь.

GTX 480, з іншого боку, представлений з 60 одиницями текстури та 48 одиницями ROP, тоді як карти нижнього кінця, такі як 430, мають лише 16 текстурних одиниць та 4 ROP-вкладиші. В цілому я не дуже впевнений, що жодне з них - це число, яке ви насправді шукаєте.

Ви можете перевірити кількість текстурних одиниць, доступних для надання фіксованого конвеєра нефіксованих функцій glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, тому, якщо у вас є доступ до різноманітного обладнання, ви можете перевірити себе.

РЕДАКТУВАННЯ: цей сайт дозволяє порівняти звітні можливості openGL різного роду відеокарт, які мають дати вам потрібні номери: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD та nvidia нещодавно представили "нев'язуючі текстури" (amd має іншу назву для цього), що дозволяє використовувати велику кількість текстур, не прив'язуючи їх до одиниць textutre, на даний момент це доступно лише у openGL.


1
Після цього справжня відповідь - це щось на кшталт «у вас є стільки, скільки може запропонувати hw». Або, формулюючи це по-різному, все повинно працювати так швидко, як тільки можна. (і в OpenGL, який охоплює майже кожне поле).
Darkwings

@Darkwings Я думаю, що так, прив'язка більшої кількості текстур, ніж апаратне забезпечення, зазвичай призводить до помилки або, проте, драйвер часу вичерпається. Я також неправильно прочитав, він сказав, що шейдер модель 4+ не opengl 4+. Дивлячись на перші картки DX10 (сім'ї карт X2900 та 8800), вони, здається, мають принаймні 16 текстурних одиниць.

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

4
-1: Ця відповідь неправильна. Дивіться мою відповідь чому (пояснювати тут занадто довго).
Нікол Болас

1
Що може бути не відразу очевидним. Майже ніхто не використовує GL_TEXTURE n GLenums; замість цього використовуйте GL_TEXTURE0 + n, де n - слот для прив’язки. GLenums має лише 32 слоти, але це не означає, що OpenGL обмежує вас до 32. Спеціалізація гарантує, що вони будуть послідовними. Крім того, якщо ви не використовуєте DSA, ви можете зарезервувати слот для прив’язки до створення / модифікації, щоб стан, який використовується для створення / зміни, мав меншу взаємодію зі станом, який використовується для малювання.
Максим Мінімус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.