GLSL 4.2图像加载和存储&内存屏障

时间:2012-04-11 18:18:31

标签: opengl concurrency thread-safety glsl textures

使用图像加载和存储,我想在GLSL 4.2中执行以下操作:

vec3 someColor = ...;
vec4 currentPixel = imageLoad(myImage, uv);
float a = currentPixel.a/(currentPixel.a+1.0f);
vec4 newPixel = vec4(currentPixel.rgb*a+someColor*(1.0f-a),currentPixel.a+1.0f);
imageStore(myImage, uv, newPixel);

对于多个光栅化像素,'uv'的值可以相同。为了得到正确的结果,我当然不希望在imageLoad()和imageStore()的调用之间写入我的像素中的其他阴影执行;

这可能以memoryBarrier的方式做某事吗?如果是的话,如何在此代码中使用它?

2 个答案:

答案 0 :(得分:2)

  

对于多个光栅化像素,'uv'的值可以相同。

然后你不能这样做。

memoryBarrier不是创建原子操作的方法。 保证单个着色器操作的顺序。因此,如果特定着色器调用读取图像,写入它,然后再次读取它,则需要memoryBarrier以确保读取的内容是之前编写的内容。如果某些其他着色器调用写入它,那么你运气不好(除非它是一个依赖调用。这些东西的规则很复杂)。

如果您尝试进行编程混合,则需要确保每个片段着色器调用都读取/写入唯一值。否则,它不会起作用。

你没有说你想要实现的是什么,所以不可能提供更好的方式来获得你想要的东西。我只能说这种的方式不起作用。

答案 1 :(得分:0)

您需要实现锁定系统(锁定/互斥锁)。 为此,最好使用imageAtomicCompSwap或使用缓冲区atomicCompSwap。当然,你需要使用全局变量(比如纹理)而不是本地变量。

出于实施目的,我认为这个问题在很大程度上解决了您的问题:Is my spin lock implementation correct and optimal?