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 GLSL 4.2图像加载和存储&;记忆载体_Opengl_Concurrency_Thread Safety_Glsl_Textures - Fatal编程技术网

Opengl GLSL 4.2图像加载和存储&;记忆载体

Opengl GLSL 4.2图像加载和存储&;记忆载体,opengl,concurrency,thread-safety,glsl,textures,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, n

使用图像加载和存储,我想在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()之间,我不希望其他shaderexecution写入我的像素

这是否可能与memoryBarrier有关?如果是这样,那么在本代码中必须如何使用它

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

那你就做不到了

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

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


你没有说你想要实现什么,所以不可能提供一个更好的方式来获得你想要的。我只能说,这种方法行不通。

您需要实现锁定系统(lock/mutex)。 为此,最好使用imageAtomicCompSwap,或者如果使用了缓冲区,则使用atomicCompSwap。当然,您需要使用全局变量(比如纹理),而不是局部变量


出于实现目的,我认为这个问题在很大程度上是对您问题的回答:

好的-已经这样认为了。非常感谢您的澄清。是的,我试着混合。我可以使用ImageAtomicAdd(..,vec4(someColor,1.0f))读取像素除以它们的.a值,但问题是像素最初已经有了颜色和权重,而这个权重介于0和0之间1@user1282931:如果您尝试进行混合,为什么有多个片段写入同一个值?这有点像反射贴图上的反投影。渲染的反射以及每像素的对象法线都存在,因此应该对reflectionmap进行近似-因此多个片段可能映射到同一个反射纹理,为了避免噪声,我想使用混合