2012-09-29 24 views
7

Estoy un poco confundido en este momento y solo quiero pedirles a todos que me ayuden a aclarar algunas ideas.DirectX Shader Resource View en Shaders

En un sombreador HLSL (sombreador de cómputo por ejemplo) puedo declarar un StructuredBuffer sb, ¿verdad? ¿TENGO que vincularlo a un registro, como por ejemplo: register (t0)?

Desde el lado de la aplicación, puedo llamar CSSetShaderResources (...). El primer argumento (el StartSlot), ¿tiene algo que ver con el pequeño número detrás de la "t" en la declaración de registro?

Si configuro StartSlot como 0 (por ejemplo), y configuro el segundo argumento como 2. ¿Le estoy diciendo a la API que voy a vincular dos Shader Resource Views, una en registro (t0) y otra en registro (t1)?

Si declaro Texture2D tex [10]: register (t0) Puedo configurarlo llamando a CSSetShaderResources (0, 10, ...). ¿Significa esto que los registros (t0 ~ t9) se han agotado?

Lo siento por un "fuego rápido" de tales preguntas, pero estoy muy confundido y algunos de mis pruebas parecen dar resultados confliting ...

Cualquier ayuda se agradece.

Respuesta

4

Así que vamos a respuesta en orden:

sí se puede, por supuesto, declarar una StructuredBuffer en un shader de cómputo (en realidad se puede declarar que para cualquier tipo de shader).

Si no utiliza el marco de efectos (técnicas), necesita declarar un registro, por lo que el sombreador sabrá dónde leer sus datos (utilizando el marco de efectos simplemente lo hace bajo el capó, pero todavía puede declarar explícitamente).

CSSetShaderResources dice que se unen N recursos desde un espacio inicial, por lo que su descripción de usar 0,2 es correcta.

Por variedad de texturas, tuve que correr PIX para comprobar que funciona, pero es de hecho la forma en que usted ha dicho.

Texture2D tex[10] : register(t0); 

significará que cada índice de la textura se le asignará una ranura a partir del registro que especifica, por lo que necesita para llamar CSSetShaderResources (0,10, srvarray) para ajustarlos.

+1

muchas gracias. Esto aclara muchas cosas ... Solo para asegurarse, para Texture2D tex [10]: register (t0), no puedo declarar otra variable usando register (t1) o register (t2) ... hasta después registrarse (t9) porque todos se agotaron, ¿verdad? (Le di un +1, respuesta muy explícita, gracias de nuevo. Lo marcaré como aceptado después de aclarar este último punto) – l3utterfly

+0

Correcto, si intenta vincular varias variables al mismo registro, compilador le dará este error "superposición de semántica de registro aún no implementado". – catflier

+0

Gracias. Respuesta aceptada – l3utterfly

2

Muy buena explicación! ¡También me confundí, y después de tus preguntas y explicaciones está claro para mí!

pero he encontrado un buen ejemplo de este post, que quiero compartir. Parece que inicia el contador de la ranura para cada Tipo de SetShaderResources. Todos los sombreadores (VS, HS, DS, PS) parecen tener su propio contador. Aquí el código de un ejemplo NVidia:

El código 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); 

El primero es la celebración de dos recursos, por lo que la siguiente ranura (línea 4) tiene que añadir 2 para la ranura de partida (0 + 2 = 2). Cada SetShaderResources tiene que comenzar con 0, pero puede hacerlo en diferentes lugares de su código, por lo tanto, no hay un espacio 0 para DS y PS aquí. Algunas veces, si elimina una línea, aún funciona, pero los datos se posponen. Ahora verá los primeros cuatro en HLSL en la línea t0, t1, t8 y t9, el otro registro estaba vinculado a otro lugar.

El código 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);