首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSBO可以在同一个着色器内读写吗?

SSBO可以在同一个着色器内读写吗?
EN

Stack Overflow用户
提问于 2021-08-01 13:18:43
回答 2查看 308关注 0票数 0

我写了一个小程序。我可以写入SSBO (使用RenderDoc检查输出),但是在相同的着色器(TCS)中立即读取数据似乎不起作用。如果我直接设置镶嵌级别,我可以看到我的代码工作:

在镶嵌控制着色器的主要部分:

代码语言:javascript
复制
 gl_TessLevelInner[0] = 1;
 gl_TessLevelOuter[0] = 1;
 gl_TessLevelOuter[1] = 2;
 gl_TessLevelOuter[2] = 4;

但是,通过SSBO内存,它不能工作。显示是空白的,就像0放置在gl_TessLevelInner & gl_TessLevelOuter输出中一样。

以下是TCS中的SSBO:

代码语言:javascript
复制
   struct SSBO_Data {
      float Inside;   // Inside Tessellation factor
      float Edges[3]; // Outside Tessellation factor
   };

   layout(std430, binding=2) volatile buffer Tiling {
      SSBO_Data Tiles[];
   };

镶嵌控制着色器的主体

代码语言:javascript
复制
   Tiles[0].Inside   = 1;
   Tiles[0].Edges[0] = 1;
   Tiles[0].Edges[1] = 2;
   Tiles[0].Edges[2] = 4;

   gl_TessLevelInner[0] = Tiles[0].Inside;
   gl_TessLevelOuter[0] = Tiles[0].Edges[0];
   gl_TessLevelOuter[1] = Tiles[0].Edges[1];
   gl_TessLevelOuter[2] = Tiles[0].Edges[2];

在C++中,我使用来自nVidia的ShaderBuffer类来创建一个几千块的数组,并将数据传输到SSBO。我确认使用RenderDoc将正确的数据存储在SSBO中。

  • 在ShaderBuffer类中,我尝试将glBufferData的用法改为GL_DYNAMIC_DRAW,而不是GL_STATIC_DRAW,但它没有帮助。
  • 我也将SSBO设置为易失性,但这没有帮助。
  • 我还插入了一个屏障();在SSBO数据的写入和读取之间,它也没有帮助。

是否可以在同一着色器内使用SSBO进行读写?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-01 18:50:23

从单个着色器实例写入任何非相干内存位置(SSBO或图像加载/存储),然后从同一位置读取时,只有在以下情况下才能在同一阶段工作

  1. ,您是在进行写入的同一个实例中读取它的。
  2. 只写到正在读取的内存中。

即使所有实例都在写入相同的值,#2仍然有效。违反#2会创建一个竞赛条件(同样,不管写的值是多少),这就是UB。

票数 2
EN

Stack Overflow用户

发布于 2021-08-01 14:13:56

  • I还在SSBO数据的写入和读取之间插入了一个barrier();,这也没有帮助。

这对您的用例没有任何帮助,您实际上需要的是glMemoryBarrierBuffer()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68610806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档