如果我正在进行实例化渲染并且需要将每个实例的一个mat4发送到顶点着色器,对于大量实例,哪种方法可能更快?
答案 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);