[问题] OpenGL Compute Shader同步不同group

楼主: Ninja5566 (苦味)   2016-12-23 04:34:15
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VS2015
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
OpenGL 4.3
问题(Question):
我想利用compute shader做一个global index array
假设我每个在 compute shader 中的 work group 有一个 shared variable, 叫做local index array,
array长度固定, 但是里面内含的有效index 数量并非固定, 例如说:
shared int array[1024]; // 每一个work group 自己具有的array
group 1: length = 3, array = 3, 4, 2, -1, -1, -1, -1.... (-1代表无效值)
group 2: length = 5, array = 1, 5, 3, 4, 6, -1, -1, -1,..
group 3: length = 1, array = 2, -1, -1, -1, -1....
因为我想要节省内存, 所以我想把这些group的local index array merge到
global index array, 也就是一个Shader Storage Buffer Object
, 并且让他长成以下这个样子:
global index array = 3, 4, 2, 1, 5, 3, 4, 6, 2, -1, -1, .....
此array 为group 依序将自己的 index array 接到前一个group的 array后方
我现在的问题是, 是否有办法做到这件事情? 困难点在于, group 2必须要等到
group 1贴完array(或至少要更新一个offset让group 2 知道他要从哪边开始贴)
,group 3 也要等到group 2 更新玩global index array的offset才知道要从哪里开始
但是 OpenGL 的barrier 只有同步同一个group的thread功能, 并无法同步不同
group, 所以我想请问有什么方法可以达到我的要求?
我原本的想法是用一块Shader Storage Buffer Object 来记录说最后一个更新
list offset group的编号是多少, 还没有轮到你的group就在一个while loop
里面等, 但是我在想这个方法是不是没什么效率, 会不会有比较好的解法?
请各位前辈帮忙回答一下, 感谢!
程式码(Code):(请善用置底文网页, 记得排版)
补充说明(Supplement):
其实我想实作Forward Plus Rendering, 但是一直不知道linked list
该怎么做..
作者: Sidney0503 (Sidney0503)   2016-12-23 08:03:00
为何不使用vao vbo?
楼主: Ninja5566 (苦味)   2016-12-23 08:16:00
compute shader完全不相容rendering pipeline
作者: johnjohnlin (嗯?)   2016-12-23 15:30:00
基本上要 2-pass,用 parallel prefix sum 作第一个 pass 只产生 element 数量,prefix sum 之后就是 offset 了,gpu 几乎不会有 global sync thread如果不 care order 的话,用 atomic add 应该还行

Links booklink

Contact Us: admin [ a t ] ucptt.com