非常酷的解释!我也很困惑,在你提出问题和解释之后,我很清楚!
但我发现了一个很好的例子,我想分享这篇文章。它似乎启动每个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开头,但是您可以在代码中的不同位置执行此操作,因此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);
非常感谢。这清除了很多东西...只是为了确保,对于Texture2D tex [10]:寄存器(t0),我无法使用寄存器(t1)或寄存器(t2)...声明另一个变量,直到注册(t9),因为它们全部用完了,对吧? (我给了你一个+1,非常明确的答案,再次感谢,我将它标记为接受后,我得到这个最后一点点清除) – l3utterfly
这是正确的,如果你尝试绑定几个变量到同一个寄存器编译器会给你这个错误“重叠寄存器语义尚未实现”。 – catflier
谢谢。接受的答案。 – l3utterfly