gpt4 book ai didi

OpenGL统一缓冲区混淆

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

有人可以告诉我看似不必要的复杂统一缓冲区吗?我已经阅读了 OpenGL Superbible 5 中的部分,我在博客上查看了一些示例,并且我已经阅读了官方规范,但我仍然不明白。

具体来说,所有示例似乎都需要一个着色器程序开始,以便最初使用 glGetActiveUniformsiv 设置统一缓冲区。我不明白这一点。为什么界面不允许您在不引用着色器程序的情况下定义结构,在链接时根据程序验证缓冲区格式?

其次,如果我从一个程序中获取结构布局,假设所有使用制服集的程序的结构布局都相同,那么结构是否保证具有相同的偏移量、数据大小等?我会这样认为。

第三,我不了解绑定(bind)点。我必须用索引调用glBindBufferBase,然后用 block 索引和我传递给glBindBufferBase的索引调用glUniformBlockBinding。我无法准确地想象这里发生了什么。 Superbible 缺乏清晰度,我看到的规范和 sample 也是如此。

最佳答案

  • 你到底为什么想要?就个人而言,除非您有严重的数据短缺问题并且需要每个字节,否则我认为没有理由使用 std140 以外的任何内容。 .它使代码更加简洁。

    但是,如果您一心想避免 std140 ,继续阅读。
  • 规范彻底解释了这一点:这一切都在布局限定符中。

    正好有 3 个布局限定符:packed , shared , 和 std140 . packed意味着实现可以随意安排一切。这包括移除当前程序不使用的制服。因此布局是实现定义的,并且该布局中的某些制服可能已被优化掉。
    shared意味着实现可以像 packed 一样自由排列数据.但是,它 必须为每件制服提供存储空间。这使得在程序之间共享统一布局成为可能,因此得名。 shared还要求实现为跨程序的一致定义提供一致的布局。因此,您只需要对一种布局进行查询。

    要回答您的第一个问题,如果您愿意,可以使用 shared 创建一个假程序。布局。您可以使用它来查询统一 block 的布局。然后,只要其他程序的布局是一致的(使用 shared 布局),所有的布局都是相同的。所以不需要专门的 API。
    std140然而,这意味着统一 block 的布局是由 OpenGL 实现逐字节明确定义的。这隐含地允许共享,因为本规范下的两个相同的统一 block 将具有相同的布局。并且由于实现无法优化 std140 中的制服。布局 block ,一切都很完美。

    同样,几乎没有理由避免 std140 .除非您受到非常非常严重的内存限制,否则不会。
  • 这与纹理的机制完全相同。唯一的区别是统一 block 名称本身不是统一的。

    纹理对象绑定(bind)到纹理图像单元,使用 glActiveTexture(GL_TEXTURE0 + i);glBindTexture() , 其中 i是纹理图像单元索引。您现在需要告诉着色器哪个采样器使用该图像单元。但是,OpenGL 不允许您直接与名称进行关联。您必须将采样器名称转换为索引位置。因此,您可以使用 glGetUniformLocation 获得特定采样器的统一位置。 .一旦有了统一的位置,就可以通过调用 glUniform1i(loc, i) 将纹理图像单元与该位置关联起来。 , 再次i是将纹理绑定(bind)到的纹理图像单元。

    统一缓冲区对象绑定(bind)到统一缓冲区绑定(bind)点,使用 glBindBufferRange(GL_UNIFORM_BUFFER, i, ...) , 其中 i是统一缓冲区绑定(bind)点。您现在需要告诉着色器哪个统一 block 使用该绑定(bind)点。但是,OpenGL 不允许您直接与名称进行关联。您必须将统一 block 转换为索引位置。因此,您可以使用 glGetUniformBlockIndex 获得特定统一 block 的索引.获得索引后,您可以通过调用 glUniformBlockBinding(program, index, i) 将统一缓冲区绑定(bind)点与该索引相关联。 , 再次i是将统一缓冲区绑定(bind)到的统一缓冲区绑定(bind)点。

    看?完全相同的。它们使用不同的术语,但在结构上,它们是相同的。如果需要图片,可以找more thorough discussion that includes a diagram here .
  • 关于OpenGL统一缓冲区混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367104/

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