【发布时间】:2012-05-18 12:42:29
【问题描述】:
我之前已经遇到了一个问题,我想通过执行以下操作在图像单元中混合颜色值:
vec4 texelCol = imageLoad(myImage, myTexel);
imageStore(myImage, myTexel, texelCol+newCol);
在多个片段可以为“myTexel”具有相同值的情况下,这显然是不可能的,因为无法在 imageLoad 和 imageStore 命令之间创建原子性,并且其他着色器调用可能会更改其间的纹素颜色。
现在有人告诉我,人们正在通过使用 uint 纹理上的原子命令创建信号量来解决这个问题,这样着色器会在一段时间循环中以某种方式等待,然后再访问 texel,一旦它空闲,就原子地写入itno 整数纹理来阻止其他片段着色器调用,处理颜色纹素,并在完成后再次原子地释放整数纹素。
但我无法思考这究竟是如何工作的,以及这样的代码会是什么样子?
真的可以做到吗?可以将 GLSL 片段着色器设置为在 while 循环中等待吗?如果可以的话,谁能举个例子?
【问题讨论】:
-
-
@awoodland:内存屏障不能让同阶段运行的其他着色器读取内存。
-
查看我对stackoverflow.com/a/16802075/1388799 的回答,了解当前有效的解决 Nvidia Kepler 卡上 GLSL 信号量问题的解决方案。
标签: opengl concurrency glsl