【发布时间】:2021-06-27 16:44:36
【问题描述】:
首先,是否有可能读取群组共享数据?或者在将其传输到 cpu 内存之前,是否需要将组共享数据复制到某个 RWbuffer?由于 RWbuffers 不能组共享(我假设这是因为您在编译时不知道缓冲区的大小)。
对于那些感兴趣的人,这是它在声明组共享缓冲区时抛出的错误:
Shader error in 'FOWComputeShader': 'Result': groupshared variables cannot hold resources at kernel CSMain at ...
基本上,我在着色器中声明了一个大的 groupshared uint 数组,价值 16kb。我将主代码中的计算缓冲区链接到这个组共享数组。调度着色器,然后从缓冲区读回。可悲的是我读回的数据都是0。
我正在使用计算着色器的统一环境中工作,我的缓冲区设置如下:
// MapSize is 128 * 128, so 16kb
// sizeof(uint) is the stride size
// ComputeBufferType.Raw, because I intend to use each uint as 4 bytes later on, so I don't want funny stuff to happen to the values
ComputeBuffer FOWMapBuffer = new ComputeBuffer(MapSize, sizeof(uint), ComputeBufferType.Raw);
FOWComputeShader.SetBuffer(kernel, "_FoWMap", FOWMapBuffer);
//just the dispatch
int ThreadCount = Mathf.CeilToInt((float)FOWdata.Count / ThreadGroupSizeX);
FOWComputeShader.Dispatch(kernel, ThreadCount, 1, 1);
//outVisibleToFaction is a byte array of 128 * 128 size
FOWMapBuffer.GetData(outVisibleToFaction);
FOWMapBuffer.Dispose();
然后在着色器内部:
// 4096 uints * 4 bytes per uint = 16kb
#define FoWMap_Size 4096
groupshared uint _FoWMap[FoWMap_Size];
[numthreads(32,1,1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
for (uint i = 0; i < FoWMap_Size; i++)
{
_FoWMap[i] = i;
}
}
这就是我的环境。 有谁知道是否可以读回组共享数据,如果可以,为什么我的缓冲区读回全 0?
【问题讨论】:
标签: unity3d shader directx-11 hlsl compute-shader