2012-09-29 199 views
7

我现在有点困惑,只想请大家帮助我理解一些想法。着色器中的DirectX着色器资源查看

在HLSL着色器(例如计算着色器)中,我可以声明一个StructuredBuffer sb,对吗?我是否必须将它绑定到一个寄存器,如:register(t0)?

从应用程序端,我可以调用CSSetShaderResources(...)。第一个参数(StartSlot)与注册声明中“t”后面的小数字有什么关系?

如果我将StartSlot设置为0(例如),并将第二个参数设置为2.我是否告诉API我将绑定两个着色器资源视图,一个在寄存器(t0)中,另一个在寄存器(T1)?

如果我声明Texture2D tex [10]:register(t0),我可以通过调用CSSetShaderResources(0,10,...)来设置它。这是否意味着寄存器(t0〜t9)全部用完?

对不起,我的问题,这样的“速射”,但我只是真的很困惑我的一些测试,似乎给confliting结果...

任何帮助,将不胜感激。

回答

4

所以,让我们为了回复:

是的,你当然可以在计算着色器(其实你可以声明其对任何类型的着色器)宣布StructuredBuffer。

如果你不使用效果框架(技术),你需要声明一个寄存器,所以着色器会知道从数据中读取哪里(使用效果框架它只是在引擎盖下,但你仍然可以明确声明)。

CSSetShaderResources告诉从一个起始槽中绑定N个资源,所以你对0,2的描述是正确的。

对于纹理数组,我必须运行PIX才能检查出来,但它的确如您所说。

Texture2D tex[10] : register(t0); 

是否意味着每个纹理指标将分配从寄存器指定起始插槽,所以你需要调用CSSetShaderResources(0,10,srvarray)进行设置。

+1

非常感谢。这清除了很多东西...只是为了确保,对于Texture2D tex [10]:寄存器(t0),我无法使用寄存器(t1)或寄存器(t2)...声明另一个变量,直到注册(t9),因为它们全部用完了,对吧? (我给了你一个+1,非常明确的答案,再次感谢,我将它标记为接受后,我得到这个最后一点点清除) – l3utterfly

+0

这是正确的,如果你尝试绑定几个变量到同一个寄存器编译器会给你这个错误“重叠寄存器语义尚未实现”。 – catflier

+0

谢谢。接受的答案。 – l3utterfly

2

非常酷的解释!我也很困惑,在你提出问题和解释之后,我很清楚!

但我发现了一个很好的例子,我想分享这篇文章。它似乎启动每个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);