zoukankan      html  css  js  c++  java
  • DirectX11 初探XMVECOTR&XMMATRIX

    初探DX11的数学库:向量XMVECOTR,矩阵XMMATRIX


    |XMVECTOR(XNA数学库的向量)

    DirectX中的一个核心数据类型为 XMVECTOR
    对它的运算可以使用SIMD指令集加速(主要处理向量的运算)。
    SIMD即Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。

    XMVECTOR 的定义:

    容下4个32位float变量

    // Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte 
    // boundary and mapped to hardware vector registers
    typedef __m128 XMVECTOR;

    XMVECTOR是可直接映射SIMD硬件上的128位寄存器

    DirectX其他定义的结构类似的几个结构体例如:
    二维向量 XMFLOAT2,三维向量 XMFLOAT3,四维向量 XMFLOAT4,颜色 XMCOLOR

    直接将它们计算时,由于没有SIMD的加速,所以速度相对较慢。

    所以倘然将它们需要做运算时,需要全部转换成XMVECTOR形式再进行运算,最后得出结果再转换成目标类型。
    那么就能让这些向量的运算允许进行SIMD加速。

    转换XMVECTOR形式,我们只利用需要的维度数据来运算,而可能多出的空位(其他维度数据)被置为0不运算。

    所以XNA数学库中也就有了这几个结构体和XMVECTOR互相转换的函数。

    |FXMVECTOR、CXMVECTOR  (const XMMATRIX(&))

    下面是龙书说的:
    For Windows, these are defined as:

    // 32-bit Windows
    typedef const XMVECTOR FXMVECTOR;
    typedef const XMVECTOR& CXMVECTOR; 
    // 64-bit Windows
    typedef const XMVECTOR& FXMVECTOR; 
    typedef const XMVECTOR& CXMVECTOR;

    FXMVECTOR或CXMVECTOR是DX的一种规定,
    在上面代码可以看到FXMVECTOR或CXMVECTOR本质是
    const XMVECTOR (或者有&)
    也就是只读性的XMVECTOR。

    DirectX库中规定,任何函数
    若需要传入3个以内包括3个只读性的XMVECOTR(只读性其实就是const)参数,则这些形参的类型应写
    FXMVECTOR
    若需要传入超过3个只读性的XMVECOTR参数,则前三个的类型应写为FXMVECTOR,超出三个的类型应写为CXMVECTOR

    举个例子:

    void func0(FXMVECTOR v1);
    //其它类型的参数,即使夹在中间,也不参与这个规则
    void func1(FXMVECTOR v1,int a,FXMVECTOR v2,int b);
    //cv4,cv5超出三个只读性参数,所以需要声明改成CXMVETOR
    //v6不是只读性的,不参与这个规则。不过不推荐传入可写入的向量,可写入的向量尽量在其作用域内操作,而不是传给另一个作用域处理。
    void func2(FXMVECTOR cv1,FXMVECTOR cv2,FXMVECTOR cv3,CXMVECTOR cv4,CXMVECTOR cv5,XMVECTOR& v6);

    那么FXMVECTOR和CXMVECTOR又有什么区别呢?

    FXMVECTOR 将代表将利用SSE/SSE2寄存器传入的const XMVECTOR类型。

    (也就是可以通过一些硬件操作来加速传入XMVECTOR参数,F意思是代表fast吧大概= =。一篇博客:具体为什么加速
    而 CXMVECTOR 只代表正常传入的const XMVECTOR类型。

    如果都用CXMVECTOR,速度不如通过SIMD寄存器的FXMVECTOR
    如果超过3个都用FXMVECTOR,多出的FXMVECTOR的传不进去寄存器(也许是可加速的参数数量有限)。
    (还有用超过3个以上的FXMVECOTR时,编译不会报错,所以在自定义函数时,要注意FXMVECTOR参数不要超过3个,不然运行期会传不进去)

    |XMVECTOR各相关类型使用规范(总结)

    1、XMVECTOR用于局部或全局变量。

    2、XMFLOAT2, XMFLOAT3,XMFLOAT4用于类成员类型。

    3、向量计算时,只对XMVECTOR类型运算。若要对XMFLOAT相关运算,须使用载入方法将 XMFLOAT相关 转换成 XMVECTOR 再做向量计算. 。

    4、存储向量时,基本只存储XMFLOAT相关类型(除了第1个规则)。若要存储XMVECTOR,须使用转换方法将XMVECTOR转换成XMFLOAT相关再存储。


    |XMMATRIX(XNA数学库的矩阵)

    DirectX中的另一个核心数据类型为 XMMATRIX
    对它的运算同样可以使用SIMD指令集加速

    XMMATRIX 的定义:

    容下 4×4 个32位float变量

    struct _XMMATRIX
    {
      union
      {
      XMVECTOR r[4];
      struct{
        FLOAT _11, _12, _13, _14;
        FLOAT _21, _22, _23, _24;
        FLOAT _31, _32, _33, _34;
        FLOAT _41, _42, _43, _44;
        };
      FLOAT m[4][4];
      }
    }XMMATRIX;

    DirectX其他定义的类似结构的结构体:

    XMFLOAT4X4

    类似XMVECTOR,存储数据用XMFLOAT4X4,需要运算时则转换成XMMATRIX来运算以获得加速,储存结果时再转回FLOAT4X4。

    |CXMMATRIX

    但是不同于向量,矩阵的传参没有类似FXMVECTOR的特殊加速传参效果(估计是矩阵数据太大了),所以所有只读性传参统一都是CXMMATRIX。

    |XMMATRIX各相关类型使用规范(总结)

    类似XMVECTOR。

    1、XMMATRIX用于局部或全局变量。

    2、XMFLOAT4X4用于类成员类型。

    3、矩阵计算时,只对XMVECTOR类型运算。若要对XMFLOAT4X4相关运算,须使用载入方法将 XMFLOAT4X4 转换成 XMMATRIX再做向量计算. 。

    4、存储矩阵时,基本只存储XMFLOAT4X4类型(除了第1个规则)。若要存储XMMATRIX,须使用转换方法将XMMATRIX转换成XMFLOAT4X4再存储。

  • 相关阅读:
    Qt5.9/C++项目开发架构理论
    Qt5及模块架构分析
    简单工厂模式实例
    SQL Server 存储过程通用分页
    面试问题
    ASP.Net 基础知识
    财务自由之路名句
    javascript 根据输入的关键词自动提示
    .NET批量更新
    在windows7上配置xampp虚拟主机
  • 原文地址:https://www.cnblogs.com/KillerAery/p/9097733.html
Copyright © 2011-2022 走看看