用计算着色器(D3D11)写入结构化缓冲区

写入结构化缓冲区时遇到一些问题。 首先,我创建一个结构化的缓冲区,填充从0到99开始的浮点值。之后,将结构化缓冲区复制到CPU可访问的缓冲区,以便将结构化缓冲区的内容打印到控制台。 输出如预期(数字0到99出现在控制台上)。 之后,我使用计算着色器来改变结构化缓冲区的内容:

RWStructuredBuffer<float> Result : register( u0 ); [numthreads(1, 1, 1)] void CS_main( uint3 GroupId : SV_GroupID ) { Result[GroupId.x] = GroupId.x * 10; } 

但计算着色器不会更改结构化缓冲区的内容。

源代码可以在这里find(main.cpp): https ://bitbucket.org/Vertexwahn/cmakedemos/src/4abb067afd5781b87a553c4c720956668adca22a/D3D11ComputeShader/src/main.cpp ? at = default

FillCS.hlsl: https ://bitbucket.org/Vertexwahn/cmakedemos/src/4abb067afd5781b87a553c4c720956668adca22a/D3D11ComputeShader/src/FillCS.hlsl ? at = default

您的调度调用Dispatch( 100, 0, 0 )实际上并不创建任何线程组。 你需要(100,1,1)。 线程组的总数是三维的乘积,所以任何零维都会使整个事情无效。

而且,运行计算着色器后,您不会将结构化缓冲区重新复制到暂存缓冲区。