gpt4 book ai didi

opengl - 使用 block 索引作为 UniformBufferObject、ShaderStorageBufferObjects 等的绑定(bind)点是否安全?

转载 作者:行者123 更新时间:2023-12-04 20:41:41 25 4
gpt4 key购买 nike

我很好奇 *BlockBinding在几个 OpenGL 缓冲区对象相关函数中使用的参数。

例如 uniformBlockBinding glUniformBlockBinding 中的参数, storageBlockBinding​glShaderStorageBlockBinding ,以及对应的 index glBindBufferRange 中的参数和 glBindBufferBase .

我知道调用glUniformBlockBindingglShaderStorageBlockBinding如果使用布局限定符在着色器中设置绑定(bind)点,则不需要,例如:

layout (binding = 0) blockName {...}

通过在我的机器上进行测试,我注意到了三件事:

1) 使用 glUniformBlockBinding 设置绑定(bind)点和 glShaderStorageBlockBinding使用布局限定符覆盖在着色器中设置的绑定(bind)点。

2) 从 glGetUniformBlockIndex 返回的 block 索引和 glGetProgramResourceIndex对于相同类型的每个 block ,按 0 到 n 排序。例如,如果着色器包含 3 个统一 block 和 2 个缓冲区 block ,则返回的索引将分别为 [0,1,2] 和 [0,1]。

3)绑定(bind)点,无论哪种方式设置,都不会跨类型冲突。例如,将统一 block 设置为 binding = 0 并将缓冲区 block 设置为 binding = 0 是完全安全的。

考虑到这些假设(如果有任何不一定正确且纯属巧合,请纠正我),有什么理由不应该让我的代码自动设置 *BlockBinding相应 block 索引的参数,并省去通过 gl*BlockBinding 手动指定它们的麻烦或使用布局限定符。

最佳答案

我曾经有过同样的问题。经过一番探索,尤其是阅读了GL的权威资料来源:https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object]
我很确定这就是为什么 block 索引和绑定(bind)点之间的分离。

将 GL 渲染上下文视为一个端口,将 glsl 程序对象视为一艘船。绑定(bind)点是港口的港口,区 block 索引是船舶储藏室的门。一艘船需要停靠在港口,其中一个门与特定港口对齐,以便将 cargo 装载到船上(或相反)。类似地, block 索引需要与要在着色器 block 和上下文缓冲区之间传输的数据的绑定(bind)点相关联。

由于这种设计, block 索引和绑定(bind)点是独立的实体。因此,简单地将绑定(bind)点等同于 block 索引是不安全的,因为这可能会无意中覆盖绑定(bind)点(可能已被其他船只停靠)。

你的观察也可以解释:

  • block 索引和绑定(bind)点从 0 开始连续计数(如您在 (2) 中观察到的)。
  • 每种类型的缓冲区(因为它们驻留在上下文中)都有一组与其他类型分开的绑定(bind)点(因此您的观察 3)。
  • 至于您的观察 1,是的,在应用程序端设置关联会抢占着色器中的硬编码绑定(bind)。
  • 关于opengl - 使用 block 索引作为 UniformBufferObject、ShaderStorageBufferObjects 等的绑定(bind)点是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212650/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com