Устраняет ли DirectX 12 необходимость атласирования текстур?

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

Одна функция, которую я видел, которая могла бы заменить его, — это динамическая неравномерная индексация массивов ресурсов в HLSL:

Texture2D<float4> textures[128];
SamplerState sampler;

textures[NonUniformResourceIndex(textureIndex)].Sample(sampler, uv);

Еще одна потенциальная функция — ExecuteIndirect, которая кодирует то, что по-прежнему представляет собой набор отдельных вызовов отрисовки и изменения ресурсов, в буфер и сразу же отправляет их в графический процессор в одном вызове процессора.

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

Мне также любопытно узнать, распространяется ли ответ на Mantle, Vulkan и Metal.


person Trillian    schedule 21.07.2016    source источник


Ответы (1)


Короткий ответ: да, длинный ответ: возможно, есть случаи, когда atlas будет иметь небольшое преимущество в производительности.

С DX12 и Vulkan вы можете забыть о Mantle. Текущее представление текстуры с дескрипторами близко к железу, использование без привязки не влечет за собой больших потерь производительности, а выборка текстуры обычной текстуры или без привязки одинакова на текущем оборудовании и, вероятно, будет даже лучше в будущее, как это путь.

на nVidia абсолютно нет штрафа, и NonUniformResourceIndex не является требованием с их архитектурой, безбиндовые просто работают.

на AMD NonUniformResourceIndex имеет последствия генерации кода шейдера, которые могут иметь стоимость, если вы их умножаете, и их лучше избегать. В идеале вы не используете вызовы отрисовки, используя более одного индекса одновременно (в одном экземпляре или перекрестном экземпляре). Это связано с тем, что GPU использует комбинацию векторных и скалярных регистров. Дескрипторы текстуры и сэмплера загружаются в скалярные регистры. Если у вас есть расходящийся индекс для вашей текстуры, она не может работать должным образом. что делает вещь NonUniformResourceIndex, генерирует цикл по активным потокам, потребляя индексы, маскируя поток для него и выполняя выборку, зацикливаясь до тех пор, пока он не продолжит работу со всеми потоками. Но если не принимать во внимание эти соображения, текстура без привязки использует ту же систему, что и обычная привязка.

ExecuteIndirect также очень хорошая сделка, теперь она не всегда идеально оптимизирована в драйверах, но с появлением большего количества игр с движками DX12 ситуация улучшится. Этот API является открытой дверью для отбраковки графического процессора и множества решений, позволяющих еще больше сократить нагрузку на процессор. На Xbox One с его помощью можно даже изменить PipelineStateObject.

person galop1n    schedule 21.07.2016
comment
Это все очень хорошая информация! Мой вариант использования подобен рисованию спрайтов без использования таблицы спрайтов, поэтому индекс текстуры, скорее всего, будет расходиться между пикселями разных пар треугольников (квадратов). Я думаю, даже на ATI, если спрайты не крошечные, очень немногие варпы будут расходиться. - person Trillian; 21.07.2016
comment
В этом случае вам придется использовать неунифицированный индексный тег, но в большинстве волн будет использоваться один индекс, и накладные расходы шейдера должны быть незначительными. Если у вас сильно перерисовываются частицы, вы можете даже растеризовать их вручную в полноэкранном проходе вычислений. - person galop1n; 22.07.2016