我现在有点困惑,只是想请大家帮助我澄清一些想法。
在HLSL着色器(例如计算着色器)中,我可以声明一个StructuredBuffer sb,对吗?我是否必须将其绑定到寄存器,例如:register(t0)?
从应用程序端,我可以调用CSSetShaderResources(...)。第一个参数(StartSlot),是否与寄存器声明中“t”后面的小数字有关?
如果我将StartSlot设置为0(例如),并将第二个参数设置为2.我告诉API我将绑定两个着色器资源视图,一个在寄存器(t0)中,另一个在寄存器中( T1)?
如果我声明Texture2D tex [10]:register(t0)我可以通过调用CSSetShaderResources(0,10,...)来设置它。这是否意味着寄存器(t0~t9)都用完了?
对于这样一个问题的“快速解雇”感到抱歉,但我真的很困惑,我的一些测试似乎给出了令人难以置信的结果......
任何帮助都将不胜感激。
答案 0 :(得分:4)
所以让我们按顺序回复:
是的,您当然可以在计算着色器中声明StructuredBuffer(实际上您可以为任何类型的着色器声明它)。
如果你不使用效果框架(技术),你需要声明一个寄存器,因此着色器将知道从数据中读取的位置(使用效果框架它只是在引擎盖下进行,但你仍然可以明确地说明声明)。
CSSetShaderResources告诉从开始时隙绑定N个资源,因此使用0,2的描述是正确的。
对于纹理数组,我不得不运行PIX来检查它,但它确实就像你说的那样。
Texture2D tex[10] : register(t0);
意味着每个纹理索引将从您指定的寄存器开始分配一个槽,因此您需要调用CSSetShaderResources(0,10,srvarray)来设置它们。
答案 1 :(得分: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 );