Просмотр ресурсов шейдеров DirectX в шейдерах

Я немного сбит с толку прямо сейчас и просто хочу попросить всех вас помочь мне прояснить несколько идей.

В шейдере HLSL (например, вычислительном шейдере) я могу объявить StructuredBuffer sb, верно? ДОЛЖЕН ли я привязать его к регистру, например: register (t0)?

Со стороны приложения я могу вызвать CSSetShaderResources (...). Первый аргумент (StartSlot), имеет ли он какое-либо отношение к маленькому числу после "t" в объявлении регистра?

Если я установил StartSlot как 0 (например), а второй аргумент - как 2. Сообщаю ли я API, что я привяжу два представления ресурсов шейдера, одно в регистре (t0), а другое в регистре (t1)?

Если я объявлю Texture2D tex [10]: register (t0), я могу установить его, вызвав CSSetShaderResources (0, 10, ...). Означает ли это, что все регистры (t0 ~ t9) израсходованы?

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

Любая помощь будет оценена.


person l3utterfly    schedule 29.09.2012    source источник


Ответы (2)


Итак, ответим по порядку:

Да, вы, конечно, можете объявить StructuredBuffer в вычислительном шейдере (на самом деле вы можете объявить его для любого типа шейдера).

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

CSSetShaderResources указывает привязать N ресурсов из начального слота, поэтому ваше описание использования 0,2 верное.

Для массива текстур мне пришлось запустить PIX, чтобы проверить это, но это действительно так, как вы сказали.

Texture2D tex[10] : register(t0); 

Будет означать, что каждому индексу текстуры будет выделен слот, начиная с указанного вами регистра, поэтому вам нужно вызвать CSSetShaderResources (0,10, srvarray), чтобы установить их.

person mrvux    schedule 29.09.2012
comment
Большое спасибо. Это многое проясняет ... Просто чтобы убедиться, что для Texture2D tex [10]: register (t0) я не могу объявить другую переменную, используя регистр (t1) или регистр (t2) ... до тех пор, пока register (t9), потому что они все будут израсходованы, верно? (Я дал вам +1, очень подробный ответ, еще раз спасибо. Я отмечу его как принятый после того, как проясню этот последний маленький вопрос) - person l3utterfly; 30.09.2012
comment
Это правильно, если вы попытаетесь привязать несколько переменных к одному регистру, компилятор выдаст вам эту ошибку, перекрывающую семантику регистров, которая еще не реализована. - person mrvux; 30.09.2012

Очень крутое объяснение! Я тоже запуталась, и после ваших вопросов и объяснений мне все ясно!

Но для этого поста я нашел хороший пример, которым хочу поделиться. Кажется, он запускает счетчик слота для каждого типа SetShaderResources. У всех шейдеров (VS, HS, DS, PS) есть свой счетчик. Вот код из примера NVidia:

Код Shaderclass:

pd3dDeviceContext->HSSetShaderResources( 0, 2, Resources ); 
pd3dDeviceContext->HSSetShaderResources( 8, 1, &m_pRegularWatertightTexSRV );
pd3dDeviceContext->HSSetShaderResources( 9, 1, &m_pQuadWatertightTexSRV );
pd3dDeviceContext->HSSetShaderResources( 2, 1, &pHeightMapTextureSRV );
pd3dDeviceContext->DSSetShaderResources( 2, 1, &pHeightMapTextureSRV );
pd3dDeviceContext->PSSetShaderResources( 2, 1, &pHeightMapTextureSRV );
pd3dDeviceContext->PSSetShaderResources( 10, 1, &pNormalMapTextureSRV );
pd3dDeviceContext->PSSetShaderResources( 3, 1, &pTexRenderRV11 );

Первый содержит два ресурса, поэтому следующий слот (строка 4) должен добавить 2 для начального слота (0 + 2 = 2). Каждый SetShaderResources должен начинаться с 0, но вы можете сделать это в разных местах кода, поэтому здесь нет слота 0 для DS и PS. Иногда, если вы удалите строку, она все еще работает, но данные откладываются. Теперь вы видите первые четыре в HLSL в строке t0, t1, t8 и t9 - другой регистр был связан где-то еще.

Код HLSL:

Texture2D<float> GregoryStencil               : register( t0 ); 
Texture2D<uint>  Index                        : register( t1 );    
Texture2D<float>  g_txHeight                  : register( t2 );       
Texture2D<float> g_depth                      : register( t3 ); 
Texture2D g_FloorTexture                      : register( t4 );  
Texture2D<float3>  regularPatchControlPoints  : register( t5 ); 
Texture2D<float3>  gregoryPatchControlPoints  : register( t6 ); 
Texture2D<float4>  g_floorHeight              : register( t7 );   
Texture2D<float2>  RegularWatertightUVs       : register( t8 );  
Texture2D<float2>  QuadWatertightUVs          : register( t9 );  
Texture2D<float3>  g_txNormal                 : register( t10 );
person Jinxi    schedule 23.10.2013