转换的实际成本= glUniformMatrix *函数中的GL_TRUE

时间:2013-12-01 16:10:50

标签: opengl

函数glUniformMatrix*有一个转置参数“指定在将值加载到统一变量时是否转置矩阵。”请参阅glUniform man page

glUniformMatrix4fv(-, -, GL_FALSE, -)glUniformMatrix4fv(-, -, GL_TRUE, -)

之间是否存在性能成本?

1 个答案:

答案 0 :(得分:4)

引擎盖下发生了什么?这取决于。

您将16个浮点数,64个字节的内存从源复制到GPU目标。如果转置为真,则这16个浮点数将作为副本的一部分重新排列。没有涉及计算,就像有一个逆矩阵,只是交换行和列。

在x86上,转置需要4次加载到SSE寄存器中,4条指令要重新排列,然后4次存储回内存。

性能成本是多少?免责声明:我不是硬件工程师,所以这些都是信封答案。

如果CPU和GPU共享内存,如Intel集成,AMD Fusion或Xbox 360,则直接内存到内存副本已成为加载 - 转置 - 存储。但是如果矩阵是你刚才计算的东西,它可能已经在缓存中,所以负载几乎是免费的。注册指令的SSE寄存器只需几纳秒。

如果CPU通过PCI-X将数据发送到卡上的GPU,则设置和完成总线传输的时间将比传输或复制仅花费64个字节。但我想认为智能图形驱动程序已经意识到这一点,并将glUniform调用分成更大的块。所以,额外的开销只是一些额外的指令。

总而言之,我会说在你达到微秒精度之前,性能成本是无法检测到的。如果你的水平很低,那么几乎肯定会发生更糟糕的事情,你应该担心。