在着色器中使用的DirectX Shader Resource View

7

我现在有点困惑,只是想请你们帮我澄清一些想法。

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

从应用程序方面来看,我可以调用 CSSetShaderResources(...)。第一个参数(StartSlot)是否与寄存器声明中“t”后面的小数字有关?

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

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

抱歉提出这么多问题,但我真的很困惑,我的一些测试似乎给出了冲突的结果...

非常感谢您的帮助。

2个回答

6

那么按顺序回答:

是的,您当然可以在计算着色器中声明StructuredBuffer(实际上,您可以为任何类型的着色器声明它)。

如果您不使用效果框架(技术),则需要声明一个寄存器,这样着色器就会知道从您的数据读取(使用效果框架时,它只是在幕后执行,但您仍然可以显式声明)。

CSSetShaderResources 告诉绑定 N 个资源从起始槽口,因此您使用0,2的描述是正确的。

对于纹理数组,我必须运行 PIX 来检查它,但确实是您所说的方式。

Texture2D tex[10] : register(t0); 

这意味着每个纹理索引都将从您指定的寄存器开始分配一个插槽,因此您需要调用CSSetShaderResources(0,10,srvarray)来设置它们。


1
非常感谢。这解决了很多问题...只是为了确保,对于Texture2D tex[10]:register(t0),我不能声明另一个变量使用register(t1)或register(t2)...直到register(t9)之后,因为它们都将被用完,对吗?(我给你+1,非常明确的答案,再次感谢。在我澄清这个最后的小问题后,我会将其标记为已接受) - l3utterfly
没错,如果你尝试将多个变量绑定到同一个寄存器,编译器会给出这样的错误提示:“重叠寄存器语义尚未实现”。 - mrvux

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接