2012-09-29 22 views
7

Sono un po 'confuso in questo momento e voglio solo chiedere a tutti voi di aiutarmi a chiarire alcune idee.Visualizzazione risorse Shader DirectX in Shader

In uno shader HLSL (shader di calcolo, ad esempio), posso dichiarare uno SB StructuredBuffer, giusto? Devo associarlo a un registro, come ad esempio: registro (T0)?

Dal lato dell'applicazione, posso chiamare CSSetShaderResources (...). Il primo argomento (la StartSlot), Ha qualcosa a che fare con il piccolo numero dopo la "t" nella dichiarazione registro?

Se imposto lo StartSlot come 0 (ad esempio), e imposto il secondo argomento come 2. Sto dicendo all'API che collegherò due viste di Shader Resource, una in registro (t0) e un'altra in registro (t1)?

Se dichesto Texture2D tex [10]: register (t0) Posso impostarlo chiamando CSSetShaderResources (0, 10, ...). Questo significa che i registri (t0 ~ t9) sono tutti esauriti?

Scusate per un "fuoco rapido" come di domande, ma io sono solo molto confuso e alcuni dei miei test sembrano dare risultati confliting ...

Qualsiasi aiuto sarebbe apprezzato.

risposta

4

Quindi cerchiamo di rispondere in ordine:

Sì, è possibile, naturalmente, dichiarare una StructuredBuffer in uno shader di calcolo (in realtà è possibile dichiarare per qualsiasi tipo di Shader).

Se non si utilizza l'effetto quadro (tecniche), è necessario dichiarare un registro, in modo dallo shader saprete dove leggere i dati (utilizzando il framework effetto che poco fa sotto il cofano, ma è ancora possibile dichiarare esplicitamente).

CSSetShaderResources indica di associare N risorse da uno slot iniziale, quindi la descrizione dell'utilizzo di 0,2 è corretta.

Per array di trame, ho dovuto eseguire PIX per verificarlo, ma è davvero il modo in cui hai detto.

Texture2D tex[10] : register(t0); 

vorrà dire che ogni indice consistenza sarà assegnato uno slot a partire dal registro specificati, quindi è necessario chiamare CSSetShaderResources (0,10, srvarray) per impostarle.

+1

Grazie mille. Questo chiarisce molte cose ... Giusto per essere sicuro, per il tex Texture2D [10]: register (t0), non posso dichiarare un'altra variabile usando register (t1) o register (t2) ... fino a dopo registrati (t9) perché saranno tutti esauriti, giusto? (Ti ho dato un +1, risposta molto esplicita, grazie ancora. La contrassegnerò come accettata dopo aver risolto questo ultimo punto) – l3utterfly

+0

È corretto, se cerchi di associare più variabili allo stesso registro, il compilatore ti darà questo errore "sovrapposizione semantica del registro non ancora implementata". – catflier

+0

Grazie. Risposta accettata – l3utterfly

2

spiegazione molto cool! Mi sono anche confuso e, dopo le tue domande e spiegazioni, è chiaro per me!

Ma ho trovato un buon esempio per questo post, che voglio condividere. Sembra che inizi il contatore dello slot per ogni tipo di SetShaderResources. Tutti gli shader (VS, HS, DS, PS) sembra avere il loro proprio contatore. Qui il codice da un esempio NVidia:

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

Il primo è in possesso di due risorse, in modo slot successivo (linea 4) deve aggiungere 2 per l'alloggiamento di partenza (0 + 2 = 2). Ogni SetShaderResources deve iniziare con 0, ma si può fare che in diversi luoghi nel codice, quindi non c'è 0 slot per DS e PS qui. Alcune volte se si rimuove una riga funziona ancora ma i dati vengono posticipati. Ora si vedono i primi quattro in HLSL alla linea T0, T1, T8 e T9 altro registro sono stati legati da qualche altra parte.

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