DirectX11 初探XMVECOTRXMMATRIX
初探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:
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再存儲。
?
轉載于:https://www.cnblogs.com/KillerAery/p/9097733.html
總結
以上是生活随笔為你收集整理的DirectX11 初探XMVECOTRXMMATRIX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总线的通信方式特点及同步通信的过程
- 下一篇: MongoDB未授权访问漏洞记录(端口: