gpt4 book ai didi

webgl - 上传统一 block 的正确顺序是什么?

转载 作者:行者123 更新时间:2023-12-02 00:52:03 27 4
gpt4 key购买 nike

https://www.lighthouse3d.com/tutorials/glsl-tutorial/uniform-blocks/ 的示例页面中有这个:

  1. uniformBlockBinding()
  2. 绑定(bind)缓冲区()
  3. 缓冲区数据()
  4. bindBufferBase()

但从概念上讲,这不是更正确吗?

  1. 绑定(bind)缓冲区()
  2. 缓冲区数据()
  3. uniformBlockBinding()
  4. bindBufferBase()

想法是,上传到缓冲区 (bindBuffer+bufferData) 应该与缓冲区的用途无关 - 然后,分别使用 uniformBlockBinding()+bindBufferBase() 来更新每个着色器的制服, 当相关缓冲区发生变化时?

最佳答案

添加答案,因为接受的答案有很多与 WebGL2 无关的信息

在初始时间调用 uniformBlockBinding。对于给定的程序,它设置特定程序将从哪个统一缓冲区索引绑定(bind)点获取特定的统一缓冲区。

在渲染时调用 bindBufferRangebindBufferBase 将特定缓冲区绑定(bind)到特定统一缓冲区索引绑定(bind)点

如果您还需要将新数据上传到该缓冲区,您可以调用 bufferData

伪代码

// at init time

for each uniform block
gl.uniformBlockBinding(program, indexOfBlock, indexOfBindPoint)

// at render time

for each uniform block
gl.bindBufferRange(gl.UNIFORM_BUFFER, indexOfBindPoint, buffer, offset, size)
if (need to update data in buffer)
gl.bufferData/gl.bufferSubData(gl.UNIFORM_BUFFER, data, ...)

请注意,没有“正确”的顺序。这里的问题是如何更新缓冲区完全取决于您。由于您可能以不同的偏移量将多个统一缓冲区数据存储在单个缓冲区中,然后像上面那样调用 gl.bufferData/gl.bufferSubData 实际上是不“正确”的,它只是 100s 的一种方式。

WebGL2 (GLES 3.0 ES) 不支持接受的答案中提到的 layout(binding = x)。 WebGL2 中也没有 glGenBuffers 这样的东西

关于webgl - 上传统一 block 的正确顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760912/

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