C++ DirectCompute着色器数据输入/输出

C++ DirectCompute着色器数据输入/输出,c++,directx,hlsl,directcompute,C++,Directx,Hlsl,Directcompute,我正在学习DirectCompute,我被StructuredBufferes困住了。问题是我了解到,要向着色器提供数据,我需要使用视图-SRV或UAV,这取决于我试图实现的目标。但是微软网站上的代码示例没有解释,C++代码中定义的视图如何对应于着色器代码中定义的特定缓冲区。然而,有一个hlsl关键字我真的不明白-register()。在样本中有三个缓冲区: StructuredBuffer<BuffType> Buff0 : register(t0); Struct

我正在学习DirectCompute,我被StructuredBufferes困住了。问题是我了解到,要向着色器提供数据,我需要使用视图-SRV或UAV,这取决于我试图实现的目标。但是微软网站上的代码示例没有解释,C++代码中定义的视图如何对应于着色器代码中定义的特定缓冲区。然而,有一个hlsl关键字我真的不明白-
register()
。在样本中有三个缓冲区:

    StructuredBuffer<BuffType> Buff0 : register(t0);
    StructuredBuffer<BuffType> Buff1 : register(t1);
    RWStructuredBuffer<BuffType> BuffOut : register(u0);
structuredbufferbuff0:寄存器(t0);
structuredbufferbuff1:寄存器(t1);
RWStructuredBuffer BuffOut:寄存器(u0);
在C++代码中,作者只需设置计算程序,1无人机,2 SRV,然后调用上下文.Debug(,,)(假设它们以前已经准备好所有的缓冲区和视图)。所以问题是-我如何理解特定的SRV(有两个)为特定的aular结构buffer提供数据?是否由寄存器编号控制(例如,寄存器(t0)先填充,寄存器(t1)-第二个)。如果是,如果我想先向第二个缓冲区提供数据,然后填充第一个缓冲区,该怎么办?我觉得我错过了一些非常重要的东西,但在以前的教程中,由于effectVariables和.GetVariableBy方法,我使用的所有东西都简单得多。
提前感谢。

着色器中声明的寄存器绑定对应于绑定数组参数中的索引。例如,如果调用
CSSetShaderResources(7/*StartSlot*/,3/*NumViews*/,viewArray),这将把
viewArray[0]
绑定到
register(t7)
viewArray[1]
绑定到
register(t8)
viewArray[2]
绑定到
register(t9)
。请注意,如果
viewArray
的一个元素为
NULL
,则将有效地解除相应寄存器插槽的绑定

注意,在HLSL中,省略显式的
寄存器
绑定将自动分配从0开始的寄存器。在常见情况下,
StartSlot
将为
0
,因此您只需确保
viewArray
中的视图顺序与着色器中的声明顺序匹配。不过,最好的做法是显式分配regster并确保它们与绑定数组匹配,因为如果HLSL编译器确定您不需要其中一个已声明的视图,它将消除它,并且不会跳过隐式分配中的槽。例如:

StructuredBuffer<float> foo; // register(t0)
StructuredBuffer<float> bar; // eliminated!
StructuredBuffer<float> baz; // register(t1) // skipped over bar!
RWStructuredBuffer<float> biz; // register(u0)
void main()
{
    float x = foo[0];
    if(x < 0) x = 0;
    else if(x >= 0) x = 1;
    else x = bar[0]; // branch never hit, compiler optimizes out the only use of bar!
    biz[0] = x + baz[0];
}
StructuredBuffer foo;//寄存器(t0)
结构缓冲条;//淘汰!
StructuredBuffer baz;//寄存器(t1)//跳过了条!
rStructuredBuffer业务;//寄存器(u0)
void main()
{
浮动x=foo[0];
如果(x<0)x=0;
如果(x>=0)x=1,则为else;
else x=bar[0];//分支从未命中,编译器优化了bar的唯一用途!
biz[0]=x+baz[0];
}