Answers:
我想从误解入手:
现代GPU(相当长一段时间以来一直是NVIDIA,而自从Southern Islands以来一直是AMD)并没有真正地在硬件中真正支持矢量/矩阵运算。它们是沿不同方向的向量体系结构:向量的每个分量(x,y,z)通常具有32或64值,其中包含泳道中每个元素的值。因此3D点积通常不是指令,它是一个乘法和两个乘法加法。
此外,对基本运算(例如乘加)进行计数,通过四元数转换向量比通过矩阵转换向量更昂贵。用3x3矩阵变换向量是3个乘法和6个乘法加法,用四元数变换向量是两个四元数乘法,每个四元数乘法包括4个乘法和12个乘法加法。(您可能会比这更幼稚-这是一种更快的方法 -但它仍然不如将向量乘以矩阵便宜。)
然而,并非总是通过简单地计算其执行的ALU操作的数量来确定性能。四元数比等效矩阵需要更少的空间(假设您仅在进行纯旋转/缩放),这意味着更少的存储空间和更少的内存流量。这在动画中通常很重要(通常在显示四元数的插值特性时也很方便)。
除此之外:
DP3
指令实现为3乘2加,请参阅INTEL_DEBUG=fs
Intel Linux驱动程序的输出:paste.ubuntu.com/23150494。不确定是驱动不良还是硬件确实没有特殊的矢量mul指令。
(在这里,我无情地从joojaa和棘轮怪胎的答案中借来了很多信息,并附带了一些我自己的笔记。)
如果您只知道要进行统一的刚体变换,那么就存储空间而言,矢量/ quat对通常是3x4矩阵的坚实优势(矢量/ quat:7或8个浮点数,而mat3x4:12个浮点数)和处理速度。如果四元数仍然是您不可思议的巫毒,请尝试在其上使用此网络系列。
矩阵比四元数提供更多的可能变换,它可以偏斜,镜像和非均匀缩放矩阵。没有任何内容表明,如果不需要其他转换功能,则无法使引擎仅执行基于四元数的转换。
当您需要构建知道基向量的空间时,矩阵非常方便。例如在投影成正交时。在矩阵空间中进行透视变换也很容易。当涉及投影时,矩阵是优越的。
通常以某种方式使用矩阵,因为它们代表最常见的面额,并且掌握和理解起来并不复杂。标准化的好处远远超过了从自定义工作流程中获得的好处。它众所周知的如何做矩阵运算。qua并不是uni中最容易立即介绍的东西。只是问周围有多少人知道如何反转四元数,而没有找到很多不知道如何反转矩阵的高等教育学生。
请注意,图形卡还具有用于矩阵操作的专用管道。