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

时间:2014-07-29 18:12:21

标签: opengl glsl

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

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

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

如果您的实例是within range,则不需要UBO的复杂性,例如,

#define MAX_INSTANCES
...
uniform mat4 xform[MAX_INSTANCES]

在顶点着色器中。您可以xform访问xform[gl_InstanceID] 这要求您可以将连续的 Matrix4数据传递给制服,例如,

glUniformMatrix4fv(location, count, [transpose], data);