Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何在计算着色器中对SSBO使用原子操作 示例代码_Opengl_Glsl_Gpu Atomics - Fatal编程技术网

Opengl 如何在计算着色器中对SSBO使用原子操作 示例代码

Opengl 如何在计算着色器中对SSBO使用原子操作 示例代码,opengl,glsl,gpu-atomics,Opengl,Glsl,Gpu Atomics,下面是一个简单的计算着色器来说明我的问题 layout(local_size_x = 64) in; // Persistent LIFO structure with a count of elements layout(std430, binding = 0) restrict buffer SMyBuffer { int count; float data[]; } MyBuffer; bool AddDataElement(uint i); float Compute

下面是一个简单的计算着色器来说明我的问题

layout(local_size_x = 64) in;

// Persistent LIFO structure with a count of elements
layout(std430, binding = 0) restrict buffer SMyBuffer
{
    int count;
    float data[];
} MyBuffer;

bool AddDataElement(uint i);
float ComputeDataElement(uint i);

void main()
{
    for (uint i = gl_GlobalInvocationID.x; i < some_end_condition; i += gl_WorkGroupSize.x)
    {
        if (AddDataElement(i))
        {
            // We want to store this data piece in the next available free space
            uint dataIndex = atomicAdd(MyBuffer.count, 1);
            // [1] memoryBarrierBuffer() ?
            MyBuffer.data[dataIndex] = ComputeDataElement(i);
        }
    }
}
布局(本地大小=64);
//具有元素计数的持久后进先出结构
布局(std430,binding=0)限制缓冲区SMyBuffer
{
整数计数;
浮动数据[];
}我的缓冲区;
bool AddDataElement(uint i);
浮点计算数据元素(uint i);
void main()
{
对于(uint i=gl\u globalinovationid.x;i
解释
SMyBuffer
是一个元素堆栈(
data[]
),具有当前元素数量的
计数。当满足某个条件时,计算着色器会以原子方式递增计数。此操作返回用于索引
数据[]
以存储新元素的上一个索引。这保证了没有两个着色器调用会覆盖彼此的元素

另一个计算着色器最终从该堆栈中弹出值并使用它们
glMemoryBarrier(GL\u着色器\u存储\u屏障\u位)
当然是两次计算着色器调度之间所必需的

问题: 所有这些都很好,但我想知道我是否只是幸运地掌握了时间,我想验证我对API的使用

那么,还需要什么来确保存储在SSBO中的计数器工作(请参阅)?我希望
atomicAdd()
能够处理内存同步,否则它就没什么意义了。原子操作的作用仅在单个线程中可见,它的意义何在

关于记忆障碍,以下方面:

请注意,原子计数器在功能上与原子映像/缓冲区变量操作不同。后者仍然需要连贯的限定词、障碍等

这让我想知道是否有一些东西我没有正确理解,实际上需要一个
memoryBarrierBuffer()
。但是如果是这样,在其中一个线程到达后续的
memoryBarrierBuffer()
之前,如何阻止两个线程执行
atomicAdd()


此外,答案是否会改变是
glDispatchCompute()
分派单个工作组还是多个工作组?

一个有趣的相关问题:另一个: