将单个缓冲区同时绑定到多个索引目标的SSBO。

3
我能否将单个opengl缓冲区同时绑定到多个索引目标(SSBO目标)?
例如,假设我的着色器有两个不同的统一块,并具有不同的绑定索引。如果我需要的信息位于同一个缓冲区中,我是否可以使用glBindBufferRange,将相同缓冲区的不同范围同时绑定到这两个绑定索引上?
另一个用例是,例如,如果我有一个着色器具有两个统一块,再次具有不同的绑定索引,但这次,两个统一块唯一的数据成员都是开放数组(大小未指定)。我是否可以使用glBindBuffer将同一缓冲区绑定到两个统一块,并通过代码保证仅访问缓冲区内适当范围内的数组索引?
1个回答

2

我认为这样做是可以的。

§6.1 (...) 当一个buffer object被绑定时,作用于它所绑定的target上的GL操作将影响到绑定的buffer object,并且对于buffer object绑定的target的查询将返回从绑定的对象中获取的状态。对于target上的操作也会影响到该对象的任何其他绑定

这里加粗的是我的强调 - 这直接表明了这是可以的。

§6.1.1. (...) 每个target表示一个索引数组的buffer object绑定点,以及一个单独的通用绑定点,可供其他buffer object操作函数(如BindBufferMapBuffer)使用。两个命令都将名为buffer的buffer object绑定到通用绑定点和索引给定的数组中的绑定点。如果绑定成功,则不会更改已绑定buffer object的状态,并且任何先前绑定到通用绑定点或数组中绑定点的绑定都将被取消。

从上面的内容中,我可以得出结论:在多个位置上绑定一个buffer range并不是明确禁止的,因此我认为这是允许的。它不会破坏数组中的其他绑定,这意味着先前绑定的范围应该保持不变且有效。

话虽如此,如果这些范围重叠并且你要向它们写入数据,你可能需要屏障。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接