很酷的解释!我也很困惑,在你的问题和解释之后,我很清楚!
但我为这篇文章找到了一个很好的例子,我想分享一下。似乎它为每个 SetShaderResources 类型启动了插槽的计数器。所有着色器(VS、HS、DS、PS)似乎都有自己的计数器。这是来自 NVidia 示例的代码:
着色器类代码:
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 行)必须为起始插槽(0+2=2)添加 2。每个 SetShaderResources 都必须以 0 开头,但您可以在代码中的不同位置执行此操作,因此这里没有用于 DS 和 PS 的 0 插槽。有时,如果您删除一条线,它仍然可以工作,但数据会被推迟。现在您在 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 );