初探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[];
  struct{
    FLOAT _11, _12, _13, _14;
    FLOAT _21, _22, _23, _24;
    FLOAT _31, _32, _33, _34;
    FLOAT _41, _42, _43, _44;
    };
  FLOAT m[][];
  }
}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再存储。

DirectX11 初探XMVECOTR&XMMATRIX的更多相关文章

  1. DirectX11 With Windows SDK--15 几何着色器初探

    前言 从这一部分开始,感觉就像是踏入了无人深空一样,在之前初学DX11的时候,这部分内容都是基本上跳过的,现在打算重新认真地把它给拾回来. DirectX11 With Windows SDK完整目录 ...

  2. 初学DirectX11, 留个纪恋。

    以前学的是openGL, 最近才开始学DirectX11,写了个很垃圾的代码,怀念以前的glPushMatrix(), glPopMatrix(), glBegin(), glEnd(), 多简单啊, ...

  3. C++小项目:directx11图形程序(三):graphicsclass

    这是框架的第三层graphicsclass,这个类才真正可以说是整个程序的框架,因为它组织了后面所有的成员. 代码: graphicsclass.h #pragma once #include< ...

  4. Directx11学习笔记【二十二】 用高度图实现地形

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...

  5. Directx11学习笔记【十四】 使用最新的Effect框架和SDK

    由于之前一直在看directx11龙书学习,因此sdk一直用的Microsoft DirectX SDK (June 2010) 版本,最近在stackoverflow上问dx11相关问题时,一直被大 ...

  6. DirectX11 With Windows SDK--10 摄像机类

    前言 DirectX11 With Windows SDK完整目录:http://www.cnblogs.com/X-Jun/p/9028764.html 由于考虑后续的项目需要有一个比较好的演示环境 ...

  7. DirectX11 With Windows SDK--00 目录

    前言 (更新于 2019/4/10) 从第一次接触DirectX 11到现在已经有将近两年的时间了.还记得前年暑假被要求学习DirectX 11,在用龙书的源码配置项目运行环境的时候都花了好几天的时间 ...

  8. DirectX11 With Windows SDK--06 DirectXMath数学库

    前言 xnamath.h原本是位于DirectX SDK的一个数学库,但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamath.h,并演变成了现在的DirectXMath.h.其实本质 ...

  9. DirectX11 With Windows SDK--07 添加光照与常用几何模型

    前言 对于3D游戏来说,合理的光照可以让游戏显得更加真实.接下来会介绍光照的各种分量,以及常见的光照模型.除此之外,该项目还用到了多个常量缓冲区,因此还会提及HLSL的常量缓冲区打包规则以及如何设置多 ...

随机推荐

  1. 【爆料】-《英博夏尔大学毕业证书》BPP一模一样原件

    英博夏尔大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...

  2. 遍历数组 foreach

    package com.java.array; public class Myforeach { public static void main(String[] ARGS){ /* int arr[ ...

  3. ActiveMQ详解

    Apache ActiveMQ介绍 使用MQ的场景 ActiveMQ的安装 收发消息的简单实现 ActiveMQ内部实现 queue和topic 消息持久化 kahadb原理 最关键的6个配置 Apa ...

  4. Spark学习之在集群上运行Spark

    一.简介 Spark 的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力.好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的完全一样.也就是说 ...

  5. 使用jdbc拼接条件查询语句时如何防止sql注入

    本人微信公众号,欢迎扫码关注! 使用jdbc拼接条件查询语句时如何防止sql注入 最近公司的项目在上线时需要进行安全扫描,但是有几个项目中含有部分老代码,操作数据库时使用的是jdbc,并且竟然好多都是 ...

  6. Python爬虫入门教程 53-100 Python3爬虫获取三亚天气做旅游参照

    爬取背景 这套课程虽然叫爬虫入门类课程,但是里面涉及到的点是非常多,十分检验你的基础掌握的牢固程度,代码中的很多地方都是可以细细品味的. 为什么要写这么一个小东东呢,因为我生活在大河北,那雾霾醇厚的很 ...

  7. Linux - 修改Cent OS系统的的hostname、配置DNS映射

    目录 1 修改方式 2 扩展: 配置DNS映射 本篇文章中, 示例设计到的操作系统是CentOS 6.5. 1 修改方式 ① 命令hostname onepiece -- 运行后设置立即生效, 但要在 ...

  8. 优雅地 `async/await`

    async/await 虽然取代了回调,使用类似同步的代码组织方式让代码更加简洁美观,但错误处理时需要加 try/catch. 比如下面这样,一个简单的 Node.js 中使用 async/await ...

  9. 服务端预渲染之Nuxt(爬坑篇)

    Nuxt是解决SEO的比较常用的解决方案,随着Nuxt也有很多坑,每当突破一个小技术点的时候,都有很大的成就感,在这段时间里着实让我痛并快乐着.在这里根据个人学习情况,所踩过的坑做了一个汇总和总结. ...

  10. LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

    这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...