Opengl GLSL 4.2图像加载和存储&;记忆载体
使用图像加载和存储,我想在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
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进行近似-因此多个片段可能映射到同一个反射纹理,为了避免噪声,我想使用混合