Сколько текстур я обычно могу связать одновременно?

23

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

У меня вопрос: сколько текстур я могу связать одновременно на современной видеокарте? 16 будет достаточно. Можно ли ожидать, что большинство современных видеокарт будут поддерживать такое количество текстур?

Мой GTX 460 поддерживает 32, но я понятия не имею, является ли он представителем большинства современных видеокарт.

Avi
источник
Какой API рендеринга вы используете?
Адам
2
OpenGL конечно :)
Ави

Ответы:

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, вы можете зарезервировать слот для привязки к созданию / изменению, чтобы состояние, используемое для создания / изменения, меньше взаимодействовало с состоянием, используемым для рисования.
Максимус Минимус