首页 > 解决方案 > GLSL:对着色器存储缓冲区的写入是否被稍后的丢弃语句丢弃(或撤消)?

问题描述

我有一个片段着色器(GLSL 4.5),它应该将非透明像素写入帧缓冲区(通过写入声明的输出变量)并将透明像素写入着色器存储缓冲区以供以后合成。为了完成这项工作,我计划将透明像素写入着色器存储缓冲区,然后调用discard以防止写入帧缓冲区。

现在我偶然发现了 khronos.org 的 OpenGL Wiki 的这一部分(重点是我的):

丢弃命令还将阻止任何图像存储和原子操作以及着色器存储缓冲区对象写入(在丢弃之前发出)工作。

看到这一点我感到非常惊讶,因为如果您考虑到不同的着色器调用能够通过写入和读取着色器存储缓冲区来交换信息,那么在达到丢弃语句之前,可能已经基于这样的写入而表现出不同的行为。

我查看了GLSL 4.5 Specification,但找不到任何支持 Wiki 声明的内容。

另外:如果这是真的,以后可能不会丢弃对共享存储缓冲区的写入?

标签: openglglslshaderfragment-shader

解决方案


该规范是明确和明确的。请参阅OpenGL 着色语言 4.60 规范 - 6.4。跳跃

[...] 这个关键字导致片段被丢弃,并且不会更新任何缓冲区。任何先前对其他缓冲区(例如着色器存储缓冲区)的写入都不受影响。[...]

因此,可以先写入 SSBO,然后再discard写入帧缓冲区,因为之前对 SSBO 的写入不受影响。


进一步查看4.60 修订版更改并丢弃之前的图像加载/存储或 SSBO 操作 #118

[...] 当着色器运行时,它正在更新外部可见的缓冲区,如果说这些更新在稍后discard[...]


推荐阅读