我通常使用 OpenGL 进行编程,但我需要从 HLSL 翻译一些代码。
我看过RWByteAddressBuffer的文档,但我不确定它如何与 InterlockedAdd 一起使用.
据说,RWByteAddressBuffer
是按字节寻址的。不过,我认为 InterlockedAdd
适用于 uint
,它们是 32 位无符号整数。
我的疑问是,当我这样做时会发生什么?
uint c;
buffer.InterlockedAdd(0, 1, c);
我是递增缓冲区的第一个字节,还是缓冲区的第一个 32 位字?如果我使用的偏移量不是 4 的倍数会怎样?
最佳答案
当你打电话时:
uint c;
uint location = 0;
buffer.InterlockedAdd(location, 1, c);
位置以字节为单位指定,但您确实在前 4 个字节(int 大小)上加了 1。
根据文档,ByteAddressBuffer/RWByteAddressBuffer 内存偏移量需要是 4 的倍数,其他值未定义。
参见(字节地址缓冲区部分):https://learn.microsoft.com/en-us/windows/win32/direct3d11/direct3d-11-advanced-stages-cs-resources
关于hlsl - 调用 RWByteAddressBuffer.InterlockedAdd 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71845154/