我正在尝试通过 unity/CG/hlsl 中的计算着色器将纹理转换为频域,即我正在尝试从纹理读取像素值并输出基函数系数数组。我该怎么办?我对计算着色器真的很陌生,所以我有点迷失。我了解竞争条件的原因以及计算着色器如何划分工作负载,但有什么方法可以解决这个问题吗?一般来说,关于缓冲区和其他事情的一般文档对于没有这方面背景的人来说似乎有点平淡无奇。
我收到的错误:
Shader error in 'Compute.compute': race condition writing to shared resource detected, consider making this write conditional. at kernel testBuffer at Compute.compute(xxx) (on d3d11)
一个简化的示例可能是将所有像素值相加,目前我的方法如下。我正在尝试使用结构化缓冲区,因为我不知道如何才能检索数据或将其存储在 GPU 上以便之后进行全局着色器访问?
struct valueStruct{
float4 values[someSize];
}
RWStructuredBuffer<valueStruct> valueBuffer;
// same behaviour if using RWStructuredBuffer<float3> valueBuffer;
// if using 'StructuredBuffer<float3> valueBuffer;' i get the error:
// Shader error in 'Compute.compute': l-value specifies const object at kernel testBuffer at Compute.compute(xxx) (on d3d11)
Texture2D<float4> Source;
[numthreads(8, 8, 1)]
void testBuffer(uint3 id : SV_DispatchThreadID) { …Run Code Online (Sandbox Code Playgroud)