如何在hlsl中增加数字



我是着色器的新手,不知道如何在计算着色器(HLSL(中增加数字。

groupshared uint i = 0;
#pragma kernel CSMain
[numthreads(8,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
if(some_condition)
{
i++;
}
if(i == 10) do_something();
}

很明显,上面的代码不起作用。i++导致比赛条件(顺便说一句,我几个小时前就知道了比赛条件(
我使用RWStructuredBuffer取得了部分成功。

RWStructuredBuffer<int> i;
#pragma kernel CSMain
[numthreads(8,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
if(some_condition)
{
int value_before_increment = i.IncrementCounter();
}
// if(i == 10) do_something();
// Can't access the value of i without continuous increment
}

我读了一些MS文档,要么他们的文档很糟糕,要么我的脑细胞很糟糕。如果你能提供一些对初学者友好的博客或文章,或者帮助我找到答案,那将非常有帮助。我知道在Stack溢出处询问文章推荐是不允许的,但有经验的人可以指导路径。

原子函数:

要访问新的资源类型或共享内存,请使用互锁内在功能。联锁功能保证运行原子。也就是说,它们保证按顺序发生编程。

您应该使用InterlockedAdd函数。

我看起来你混淆了I(这里是一个缓冲区,命名像变量,它造成了你的错误(及其内容和or变量

线路如果(i==10(do_something((;

应该是

if(i[id.x] == 10) do_something();

或者在您的情况下是

if(i[value_before_increment] == 10) do_something();

if(value_before_increment == 10) do_something();

最新更新