Текстурный атлас и массив-текстура: как по-разному они обрабатываются процессором и графическим процессором и как это влияет на производительность?

10

В Unity 5.4 (в настоящее время в бета-версии) появится очень ожидаемая функция (с 2013 года) - текстуры массивов - в том же духе, что и в ArrayTexture OpenGL . Однако, после некоторого прочтения массивов-текстур и текстурных атласов, я все еще не совсем понимаю технические различия в их использовании процессорами и графическими процессорами.

Итак, чтобы быть более конкретным, я хотел бы попросить объяснить основные различия между тем, как текстурный атлас и массивы текстур обрабатываются процессором и графическим процессором, и, что наиболее важно, как такие различия могут влиять на производительность и обработку памяти (например, как текстурные массивы могут быть более производительными, чем текстурные атласы и т. д.).

Если технические детали реализации Unity отсутствуют из-за его неудачной закрытой исходной кодировки, я был бы достаточно счастлив с ответом относительно OpenGL.s ArrayTexture.

ASteer
источник
Я не удивился, что вы не нашли технического сравнения, так как оба зависят от реализации (больше для массивов).
Wondra
Вам будет трудно получить информацию о том, как работают внутренние механизмы движка Unity, поскольку это черный ящик с закрытым исходным кодом. Единственное, что вы можете сделать, - это профилировать каждый случай и сравнить себя с процессором и процессором. Чтобы понять, как это работает, потребуется вмешательство инженера Unity или открытие или утечка исходного кода.
jgallant
@Jon Справедливо, но на самом деле меня больше интересовал независимый от двигателя ответ. Если он сильно варьируется, я могу обновить вопрос, чтобы поговорить, например, об ArrayTexture в OpenGL: opengl.org/wiki/Array_Texture
ASteer

Ответы:

11

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

Однако есть несколько различий в том, как вы используете каждую опцию, которые будут применяться последовательно:

Одно большое отличие состоит в том, что для текстур массива каждая текстура обрабатывается отдельно для таких целей, как перенос текстурных координат или мипмаппирование.

Это позволяет избежать распространенных проблем с текстурными атласами, когда нам нужно добавить отступ между смежными образцами текстур, чтобы сэмплы на их краях не кровоточили, особенно на более глубоких уровнях мипов.

Это также означает, что если вы хотите, чтобы ваши текстуры были мозаичными, вы можете использовать аппаратное обеспечение для выборки текстур, чтобы сделать это так же, как с ванильной текстурой. В случае атласов нам обычно приходится выполнять математику в нашем фрагментном шейдере, поскольку сэмплер только оборачивает / отражает / отражает / закрепляет / ограничивает координаты текстуры по всему атласу, а не по отдельным плиткам внутри него.

Основное ограничение для текстур массива состоит в том, что они требуют, чтобы все составляющие их текстуры имели одинаковое разрешение и количество уровней MIP. Если вы пытаетесь соединить вместе текстуры с очень разными требованиями к разрешению (скажем, хранить плитки ландшафта, у которых LoD падает с расстоянием в виртуальной текстуре ), тогда вам может понадобиться гибкость атласа.

ДМГригорий
источник
Спасибо, это было именно то, что я был после. Я имею в виду, не ответ о том, что именно быстрее, чем меньше памяти - поскольку, конечно, они зависят от реализации. Тем не менее, я был уверен, что некоторые указатели на функционирование каждого случая могут быть полезны для понимания их обычных наилучших и худших подходящих сценариев. Ваш ответ действительно помог мне в этом.
ASteer
Еще один недостаток массивов текстур: они ограничены GL_MAX_ARRAY_TEXTURE_LAYERS. На моем полу-современном GPU это 2048, поэтому, если вам нужны тонны крошечных текстур, это ограничение может быть слишком низким.
JWD