2012-09-29 17 views
7

Ich bin gerade ein bisschen verwirrt und möchte Sie alle bitten, mir ein paar Ideen klar zu machen.DirectX Shader Resource View in Shadern

In einem HLSL Shader (compute Shader zum Beispiel) kann ich einen StructuredBuffer sb deklarieren, oder? Muss ich es an ein Register binden, wie zum Beispiel: register (t0)?

Von der Anwendungsseite kann ich CSSetShaderResources (...) aufrufen. Das erste Argument (der StartSlot), hat es irgendetwas mit der kleinen Zahl hinter dem "t" in der Registerdeklaration zu tun?

Wenn ich den StartSlot als 0 setze (zum Beispiel), und ich setze das zweite Argument als 2. Ich sage der API, dass ich zwei Shader Resource Views binden werde, eine im Register (t0) und eine andere im Register (t1)?

Wenn ich Texture2D tex [10] deklariere: register (t0) kann ich es durch den Aufruf von CSSetShaderResources (0, 10, ...) setzen. Bedeutet dies, dass alle Register (t0 ~ t9) aufgebraucht sind?

Sorry für solchen „Schnellfeuer“ von Fragen, aber ich bin gerade wirklich verwirrt und einige meiner Tests scheinen confliting Ergebnisse zu geben ...

Jede Hilfe würde geschätzt.

Antwort

4

Lassen Sie uns also, um antworten:

Ja, Sie natürlich eine StructuredBuffer in einem Compute-Shader erklären kann (tatsächlich Sie es für jede Art von Shader erklären kann).

Wenn Sie kein Effektframework (Techniken) verwenden, müssen Sie ein Register deklarieren, damit der Shader weiß, wo Sie aus Ihren Daten lesen können (mit effect framework macht es das einfach unter der Haube, aber Sie können es immer noch erklären Sie ausdrücklich).

CSSetShaderResources gibt an, N Ressourcen von einem Startplatz zu binden, daher ist Ihre Beschreibung der Verwendung von 0,2 korrekt.

Für eine Reihe von Texturen musste ich PIX ausführen, um es zu überprüfen, aber es ist in der Tat, wie Sie sagten.

Texture2D tex[10] : register(t0); 

bedeutet, dass jeder Texturindex aus der von Ihnen angegebenen Register beginnend mit einem Schlitz zugewiesen werden, so müssen Sie CSSetShaderResources (0,10, srvarray) rufen sie zu setzen.

+1

Vielen Dank. Das macht viele Dinge klar ... Nur um sicherzugehen, kann ich für das Texture2D tex [10]: register (t0) keine weitere Variable über Register (t1) oder Register (t2) ... bis danach deklarieren registriere dich (t9), weil sie alle aufgebraucht sind, oder? (Ich habe Ihnen eine +1, sehr explizite Antwort gegeben, nochmals danke. Ich werde es als akzeptiert markieren, nachdem ich diesen letzten kleinen Punkt geklärt habe) – l3utterfly

+0

Das ist richtig, wenn Sie versuchen, mehrere Variablen an das gleiche Register zu binden Compiler wird Ihnen diesen Fehler "überlappende Registersemantik noch nicht implementiert" geben. – catflier

+0

Danke. Akzeptierte Antwort. – l3utterfly

2

Sehr coole Erklärung! Ich bin auch verwirrt, und nach deinen Fragen und Erklärungen ist es für mich klar!

Aber ich fand ein gutes Beispiel für diesen Beitrag, den ich teilen möchte. Es scheint, dass es den Zähler des Slots für jeden SetShaderResources-Typ startet. Alle Shader (VS, HS, DS, PS) scheinen ihren eigenen Counter zu haben. Hier ist der Code von einem NVidia Beispiel:

Der Shaderclass Code:

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); 

Die erste hält zwei Ressourcen, so dass der nächste Schlitz (Linie 4) hat 2 für den Ausgangsschlitz addieren (0 + 2 = 2). Jede SetShaderResources muss mit 0 beginnen, aber Sie können das an verschiedenen Stellen in Ihrem Code tun, deshalb gibt es hier keinen 0-Slot für DS und PS. Einige Male, wenn Sie eine Linie entfernen, funktioniert es noch, aber die Daten werden verschoben. Jetzt sehen Sie die ersten vier in HLSL in Zeile t0, t1, t8 und t9 das andere Register wurden woanders gebunden.

Der HLSL-Code:

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);