上传mat4属性(VBO)与mat4制服(UBO)的性能

use*_*637 4 opengl glsl

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

  1. 使用instanced mat4属性(glVertexAttribDivisor)并将mat4s发送到每个帧的VBO(glBufferData)
  2. 在统一块中使用mat4制服数组,使用统一缓冲区对象每帧更新数组,并使用gl_InstanceID作为数组索引访问相应的mat4

use*_*637 9

基于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