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

时间:2015-11-10 13:41:54

标签: c++ opengl shader opengl-4

我是否允许同时将单个opengl缓冲区绑定到多个索引目标(SSBO目标)?

例如,假设我的着色器有两个不同的统一块,它们具有不同的绑定索引。如果我需要的信息位于同一个缓冲区中,我是否可以使用i=5,同时将同一缓冲区的不同范围绑定到这两个绑定索引?

我看到的另一个用例是,例如,如果我有一个带有两个统一块的着色器,同样具有不同的绑定索引,但这一次,统一块的唯一数据成员是一个打开的数组(具有未指定的大小) 。我是否允许使用glBindBufferRange将相同的缓冲区绑定到两个统一块,并通过代码保证只访问缓冲区中适当范围内的数组索引?

1 个答案:

答案 0 :(得分:2)

我相信这样做很好。

  

§6.1(...)绑定缓冲区对象时,对其绑定的目标执行GL操作   影响绑定缓冲区对象,以及缓冲区对象所针对的目标的查询   绑定对象的绑定返回状态。目标上的操作也会影响 any   该对象的其他绑定

强调我的 - 这会直接表明它没问题。

  

§6.1.1。(...)每个目标代表一个缓冲对象绑定点的索引数组,以及   作为可由其他缓冲区对象操作使用的单个通用绑定点   功能,例如BindBufferMapBuffer。两个命令绑定   缓冲区对象由缓​​冲区命名为一般绑定点和绑定   指向索引给出的数组。如果绑定成功,则不进行任何更改   到绑定缓冲区对象的状态,以及之前对常规的任何绑定   绑定点或数组中的绑定点被破坏

我从中提炼出来的是,禁止将缓冲区范围绑定到多个位置是明确禁止的,因此,我认为它是允许的。它不会破坏该数组中的其他绑定,这意味着先前绑定的范围应保持不变且有效。

话虽如此,如果范围重叠并且您正在写入它们,则可能需要障碍。