1

使用图像加载和存储,我想在 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 一起做吗?如果是这样,它必须如何在此代码中使用?

4

2 回答 2

2

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

那你就做不到了。

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

如果您尝试进行程序化混合,则需要确保每个片段着色器调用都读取/写入唯一值。否则,它将无法正常工作。

你没有说你真正想要达到的目标是什么,所以不可能提供更好的方式来获得你想要的东西。我只能说,这种方式行不通。

于 2012-04-11T18:38:14.523 回答
0

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

出于实现目的,我认为这个问题在很大程度上回答了您的问题:我的自旋锁实现是否正确且最优?

于 2013-05-10T12:56:35.703 回答