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

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

    最佳答案

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

    这是我的结果:

  • mat4制服(通过glUniformMatrix4fv更新),每个平局调用具有254个实例(由于制服限制而受到限制)= 160 fps
  • 一块中的
  • mat4制服(通过UBO更新),每个绘图调用具有254个实例(由于制服限制而受到限制)= 260 fps
  • mat4属性(通过VBO更新),每个绘图调用具有40000个实例= 287 fps
  • 10-08 01:16