【问题标题】:Performance of uploading mat4 attributes (VBO) versus mat4 uniforms (UBO)上传 mat4 属性 (VBO) 与 mat4 制服 (UBO) 的性能
【发布时间】:2014-07-29 18:12:21
【问题描述】:

如果我正在进行实例化渲染并且需要将每个实例发送一个 mat4 到顶点着色器,那么对于大量实例来说,哪种方法可能更快?

  1. 使用实例化 mat4 属性 (glVertexAttribDivisor) 并将 mat4 每帧发送到 VBO (glBufferData)
  2. 在统一块中使用 mat4 统一数组,每帧使用统一缓冲区对象更新数组,并使用 gl_InstanceID 作为数组索引访问适当的 mat4

【问题讨论】:

  • 唯一确定的方法是分析。但考虑到这正是 glVertexAttribDivisor 旨在解决的用例,我希望选项 1 更有效。它也更整洁。
  • @robinjam - 我同意分析是确定的唯一方法,但我认为虽然glVertexAttribDivisor 非常适合大量位置不变的实例(例如森林),我认为当他们的变换必须每帧更新时,这是一个更接近的要求。设置制服可能比更新缓冲区更快。

标签: opengl glsl


【解决方案1】:

根据 robinjam、GuyRT 和 Brett Hale 的 cmets/answers,我做了一些测试。 测试渲染了相同网格(三角形)的 40000 个实例,每帧更新每个实例的模型矩阵。我的 GPU 是 GeForce GTX 460 SE。

这是我的结果:

  • mat4 制服(通过 glUniformMatrix4fv 更新),每次绘制调用 254 个实例(由于制服限制)= 160 fps

  • 一个块中的 mat4 制服(通过 UBO 更新),每次绘制调用 254 个实例(由于制服限制而受到限制)= 260 fps

  • mat4 属性(通过 VBO 更新),每次绘制调用 40000 个实例 = 287 fps

【讨论】:

  • 感谢您发布您的结果。我对 UBO 不是很熟悉。我认为使用它们与直接统一数组相比,您不会受到相同的限制。
  • 我也这么认为,直到我提出问题以确保:stackoverflow.com/questions/25017625/…
  • 啊,是的。我混淆了统一的位置和统一的存储。
  • 但是如果你将矩阵传递给片段着色器,而不是仅仅在顶点着色器中相乘呢? UBO方法比VBO方法快吗?
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多