我写了一个小程序。我可以写入SSBO (使用RenderDoc检查输出),但是在相同的着色器(TCS)中立即读取数据似乎不起作用。如果我直接设置镶嵌级别,我可以看到我的代码工作:
在镶嵌控制着色器的主要部分:
gl_TessLevelInner[0] = 1;
gl_TessLevelOuter[0] = 1;
gl_TessLevelOuter[1] = 2;
gl_TessLevelOuter[2] = 4;但是,通过SSBO内存,它不能工作。显示是空白的,就像0放置在gl_TessLevelInner & gl_TessLevelOuter输出中一样。
以下是TCS中的SSBO:
struct SSBO_Data {
float Inside; // Inside Tessellation factor
float Edges[3]; // Outside Tessellation factor
};
layout(std430, binding=2) volatile buffer Tiling {
SSBO_Data Tiles[];
};镶嵌控制着色器的主体
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中。
是否可以在同一着色器内使用SSBO进行读写?
发布于 2021-08-01 18:50:23
从单个着色器实例写入任何非相干内存位置(SSBO或图像加载/存储),然后从同一位置读取时,只有在以下情况下才能在同一阶段工作
即使所有实例都在写入相同的值,#2仍然有效。违反#2会创建一个竞赛条件(同样,不管写的值是多少),这就是UB。
发布于 2021-08-01 14:13:56
barrier();,这也没有帮助。这对您的用例没有任何帮助,您实际上需要的是glMemoryBarrierBuffer()。
https://stackoverflow.com/questions/68610806
复制相似问题