我是否允许同时将单个opengl缓冲区绑定到多个索引目标(SSBO目标)?
例如,假设我的着色器有两个不同的统一块,它们具有不同的绑定索引。如果我需要的信息位于同一个缓冲区中,我是否可以使用i=5
,同时将同一缓冲区的不同范围绑定到这两个绑定索引?
我看到的另一个用例是,例如,如果我有一个带有两个统一块的着色器,同样具有不同的绑定索引,但这一次,统一块的唯一数据成员是一个打开的数组(具有未指定的大小) 。我是否允许使用glBindBufferRange
将相同的缓冲区绑定到两个统一块,并通过代码保证只访问缓冲区中适当范围内的数组索引?
答案 0 :(得分:2)
我相信这样做很好。
§6.1(...)绑定缓冲区对象时,对其绑定的目标执行GL操作 影响绑定缓冲区对象,以及缓冲区对象所针对的目标的查询 绑定对象的绑定返回状态。目标上的操作也会影响 any 该对象的其他绑定
强调我的 - 这会直接表明它没问题。
§6.1.1。(...)每个目标代表一个缓冲对象绑定点的索引数组,以及 作为可由其他缓冲区对象操作使用的单个通用绑定点 功能,例如
BindBuffer
或MapBuffer
。两个命令绑定 缓冲区对象由缓冲区命名为一般绑定点和绑定 指向索引给出的数组。如果绑定成功,则不进行任何更改 到绑定缓冲区对象的状态,以及之前对常规的任何绑定 绑定点或数组中的绑定点被破坏
我从中提炼出来的是,禁止将缓冲区范围绑定到多个位置是明确禁止的,因此,我认为它是允许的。它不会破坏该数组中的其他绑定,这意味着先前绑定的范围应保持不变且有效。
话虽如此,如果范围重叠并且您正在写入它们,则可能需要障碍。