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 计算着色器调用写入冲突_Opengl_Compute Shader - Fatal编程技术网

Opengl 计算着色器调用写入冲突

Opengl 计算着色器调用写入冲突,opengl,compute-shader,Opengl,Compute Shader,我正在使用计算着色器进行一些工作,我注意到,如果使用imageStore将两个调用写入纹理上的同一位置,则在渲染纹理时会出现闪烁效果,因为访问速度无法保证,因此有时一个调用最后到达,有时是另一个调用。我希望我的最终颜色值是,比如说,红色值最高的值。我有没有办法在着色器中确定这一点 我觉得有点混乱,所以我会提供更多的信息。我正在使用绑定在CPU上的数据作为GL\u UNSIGNED\u BYTE,并使用 layout(r8,binding=0)统一图像3D可视化纹理 在这个阶段,我只想停止闪烁,即

我正在使用计算着色器进行一些工作,我注意到,如果使用
imageStore
将两个调用写入纹理上的同一位置,则在渲染纹理时会出现闪烁效果,因为访问速度无法保证,因此有时一个调用最后到达,有时是另一个调用。我希望我的最终颜色值是,比如说,红色值最高的值。我有没有办法在着色器中确定这一点

我觉得有点混乱,所以我会提供更多的信息。我正在使用绑定在CPU上的数据作为
GL\u UNSIGNED\u BYTE
,并使用

layout(r8,binding=0)统一图像3D可视化纹理

在这个阶段,我只想停止闪烁,即某些着色器调用优先于其他着色器调用。最高值是理想的,但我希望这是快速的。

仅允许用于单通道32位格式(整数和浮点)。因此,只需将数据更改为使用32位整数,而不是8位整数,然后使用
imageAtomicMax
将值设置到图像中


您可以只使用32位整数缓冲区作为中介,并使用后处理读取32位数据并将其写入8位缓冲区。

也许您可以使用原子操作?或者屏障也可能有帮助,我确实想过,但我的问题是只有一个写操作,我不认为写操作可以原子化完成。所以我部分是对的。原子操作只对32位图像有效,而我使用的图像是8位的。这会成为一个问题吗?如果你使用三/四个香奈儿图像,你可以将值从4 x 8转换为32位图像。不,我是单通道,
gl_R8
是我的编码方案。为了完成这个答案,这里有一个关于如何建立这样的链接列表的解释:对不起,我已经把我的内容弄清楚了一点。我使用的是单通道,我将它作为
GL\u UNSIGNED\u BYTE
绑定到CPU上,如果这有助于解决问题的话all@irishMTS:好吧,把它设为32位整数,你可以使用
imageAtomicMax
,就像我说的;)答案更新了。好的,这很好,但是我如何从8位浮点转换成32位整数呢?