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

问题描述 投票:0回答:2

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

例如,假设我的着色器有两个具有不同绑定索引的不同统一块。如果我需要的信息位于同一个缓冲区中,我是否可以使用

glBindBufferRange
,同时将同一缓冲区的不同范围绑定到这两个绑定索引?

我看到的另一个用例是,例如,如果我有一个带有两个统一块的着色器,同样具有不同的绑定索引,但这一次,两个统一块拥有的唯一数据成员是一个开放数组(未指定大小)。我是否可以使用

glBindBuffer
将相同的缓冲区绑定到两个统一块,并通过代码保证仅访问缓冲区中适当范围内的数组索引?

c++ opengl shader opengl-4
2个回答
2
投票

我相信这样做很好。

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

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

§6.1.1. (...) 每个目标也代表缓冲区对象绑定点的索引数组 作为可由其他缓冲区对象操作使用的单个通用绑定点 函数,例如

BindBuffer
MapBuffer
。两个命令都绑定 由 buffer 命名的缓冲区对象既适用于一般绑定点,也适用于绑定 由索引给出的数组中的点。如果绑定成功,则不进行任何更改 绑定缓冲区对象的状态,以及任何先前与通用缓冲区对象的绑定 绑定点或数组中的绑定点已损坏

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

话虽这么说,如果范围重叠并且您正在写信给他们,则可能需要障碍。


0
投票

它有效,但是...

请注意,预计实现可能会有所不同 有效存储索引和的内存类型要求 顶点... Khronos 组

© www.soinside.com 2019 - 2024. All rights reserved.