更新统一缓冲区对象会降低性能吗?

Osc*_*car 4 opengl glsl

我用 UBO 替换了着色器中像 mvp 矩阵这样的制服,以避免大量的 glUniform...() 调用。但是为了在每一帧中更新 UBO,我必须调用 glBufferData(),这也会降低性能。现在我有点困惑是回到使用uniforms还是在着色器中使用uniform块。

pqn*_*net 5

指定一堆glUniform调用通常比单个调用 慢glBufferData,除非您每帧只修改几个统一值。

因此,您应该基于此决定采用哪种策略。一些注意事项:

  • 请记住,这glBufferData可能不是更新缓冲区的最佳方式,因为它需要驱动程序在从调用返回之前从您提供的指针复制数据。我会尝试使用glMapBufferRange并将更改直接写入其中。请记住,为了避免同步,您需要告诉驱动程序您不会从它提供给您的指针中读取数据,并且您将写入使用标志GL_MAP_WRITE_BIT和映射的整个范围GL_MAP_INVALIDATE_RANGE_BIT
  • opengl 调用的性能取决于实现:即使驱动程序被授权执行一些优化,例如分配新缓冲区而不是等待旧缓冲区可用,因为您没有请求能够使用旧内容映射范围,它仍然可以同步,因此您可以获得的唯一可靠答案是在目标硬件上尝试并进行基准测试。