GLSL中的memoryBarrier和OpenGL API中的glMemoryBarrier有什么区别?



是GLSL中的memoryBarrier在单个着色器调用中排序内存事务,而OpenGL API中的glMemoryBarrier在多个着色器调用中排序内存事务(不一定是同一程序)吗?

是GLSL中的memoryBarrier在内存事务中排序吗OpenGL API中的glMemoryBarrier和单个着色器调用跨多个着色器调用(其中(不一定属于同一个程序)。

不完全是。你应该首先弄清楚着色器调用是什么:它是处理单个输入实体的着色器代码的执行。因此,对于绘制调用的每个顶点都有一个顶点着色器调用,并且对于由光栅化产生的每个片段至少有一次片段着色器调用(在某些类型的多重采样中,它将多于一个)。不同绘制调用的着色器调用(可能不同)当然也是不同的调用。但通常,当一个人说到"多次调用"时,一个意思是在相同的绘制调用期间使用相同的着色器(它们都可能并行执行)。

GLSL规范(版本4.40)(第8.17节)对内存屏障有如下说明:

所有类型的着色器都可以读取和写入纹理的内容使用图像变量缓冲对象。而顺序是和在单个着色器调用中写入是定义良好的,相对的对单个共享内存地址进行读写的顺序多个单独的着色器调用在很大程度上是未定义的。订单的内存访问执行的一个着色器调用,如观察到的其他着色器调用,也很大程度上是未定义的,但可以通过内存控制功能控制。

所以,这可能是或可能不是你在上面的语句的意思,这取决于你对"单调用"的意思。,但前提是您将其解释为"对单个draw调用的所有调用"。

这是来自OpenGL 4.4核心配置文件规范,第7.12.2节

需要显式同步,以确保缓冲区和纹理数据存储执行着色器将是可见的使用相同对象的后续操作将不会覆盖先前请求的操作仍需读取的数据。没有手动同步,着色器存储一个"新的"原语可能在"旧"原语处理完成之前完成。此外,"旧"原语的存储可能还没有完成在" new "原语开始处理之前。

所以这也不是所有关于着色器调用的后续绘制调用。它甚至根本不需要新的着色器调用:如果下面的GL命令使用或覆盖你的着色器写入的数据,你必须手动同步它。请注意,这只与你的着色器写入缓冲区或纹理有关,它将与"普通"framebuffer通过管道写入无关:

相同着色器类型调用的相对顺序是未定义的。当在原语B上工作时,由着色器发出的存储可能在原语a的存储之前完成,即使是原语a在原语b之前指定,这甚至适用于片段着色器;而片段着色器输出被写入framebuffer在原始顺序中,由片段着色器调用执行的存储是不是。

我建议你阅读整个7.12节,它太长了,不能粘贴在这里,但是对于理解GL的内存屏障函数是至关重要的。

相关内容

  • 没有找到相关文章