日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DirectX11 初探XMVECOTRXMMATRIX

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

// 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再存儲。

?

轉載于:https://www.cnblogs.com/KillerAery/p/9097733.html

總結

以上是生活随笔為你收集整理的DirectX11 初探XMVECOTRXMMATRIX的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。