2014-10-13 3 views
1

У меня есть система управления для моих шейдерных ресурсов, которая автоматически генерирует код заголовка HLSL для всех моих шейдеров, выглядит примерно так:DirectX 11: Количество СВЯЗАННЫХ Shader ресурсов Просмотры

Texture2DArray <float4> MyTextureArray1 : register(t0) 
    Texture2DArray <float4> MyTextureArray2 : register(t1) 
    Texture2DArray <float4> MyTextureArray3 : register(t2) 
    Texture2DArray <float4> MyTextureArray4 : register(t3) 

Система управления автоматически создает и связывает все представления ресурсов шейдера во время создания. Очевидно, мои шейдеры используют, возможно, 1 или 2 из этих текстур, но я оставляю их все связанными все время. Может ли кто-нибудь предположить, лучше ли мне привязывать только SRV, которые мне нужны сейчас, и очищать остальные каждый раз, когда я привязываю шейдер, или лучше просто привязать все SRV во время создания и никогда не трогать их снова ? Я не нашел много документации, описывающей накладные расходы на удержание ресурсов, хотя я их в настоящее время не использую.

Как часть примечания, в некоторых моих проектах у меня есть 30 или 40 SRV из-за различных форматов, размеров текстур и обычаев.

Что лучше?

1) Свяжите все 128 и никогда не меняют привязки

2) Bind и UNBIND SRVs по мере необходимости при смене шейдеров

ответ

1

В DX11 можно создать тысячи SRVs. Однако вы можете привязать 128 из них к каждой стадии шейдера. Пока вы не используете более 128 SRV на каждый этап, и вы правильно индексируете их в своем коде HLSL, тогда вы добры. Также взгляните на Direct3D 11 Resource Limits на MSDN.

+0

Я знаю о границах ресурсов. Есть ли накладные штрафы, если вы скажете, что все 128 SRV связаны? Что лучше? 1) Привяжите все 128 и никогда не меняйте привязки 2) При необходимости привязывайте SRVs при изменении шейдеров. –

+0

Когда вы привязываете SRV, вы меняете состояние конвейера, которое имеет некоторое ограничение производительности. Если ваша сцена имеет менее 128 различных текстур, то привязка их всех одновременно будет лучшим подходом. Однако большинство игр связывают различные текстуры с конвейером для каждого объекта, который визуализируется. Это потому, что в целом для рендеринга сцены используется более 128 текстур. – rashmatash

+0

Более 128 текстур - это моя система управления. Он собирает текстуры для всех объектов сцены и упаковывает их в массивы текстур и настраивает шейдер каждого объекта. Это значительно уменьшает общее количество буферов. Мне все еще было интересно узнать о том, как оставить эти большие буферы, даже если шейдер не получит к нему доступа. Например, один массив текстур имеет несколько карт высоты высокого разрешения для местности, которые остаются связанными при рендеринге всего остального. –