D3D 頂點快取的設計

2021-06-28 08:48:24 字數 2510 閱讀 6900

如果我們要研發一部手機,首先要進行策劃,做好設計圖紙。使用頂點快取也是一樣,想要使用頂點快取繪製圖形,第一步的工作就是對頂點的型別進行設計。今天我們要介紹的一套頂點格式,是固定功能流水線中使用頻繁的一套頂點定義格式——靈活頂點格式(flexible vertex format,fvf)。需要說明的是,與靈活頂點格式對應的是可程式設計渲染流水線中的「頂點宣告」頂點定義套路,今天我們暫時先介紹靈活頂點格式這套定義套路。

靈活頂點格式(flexible vertex format,fvf)來描述三角形網格的每個頂點。靈活頂點格式可以讓我們隨心所欲地自定義其中所包含的頂點屬性資訊。例如,指定頂點的三維座標、顏色、頂點法線和紋理座標等等。

建立自定義靈活頂點格式時,根據實際的需求,需要定義乙個包含特定頂點資訊的結構體。主動權在我們這裡,我們可以隨心所欲地定義頂點包含的屬性。比如我們可以定義乙個只包含頂點三維座標和顏色的結構體。

struct

customvertex

struct customvertex;
我們當然也可以定義乙個複雜一點,包含很多屬性的頂點:

struct

normaltexvertex

;

struct normaltexvertex;
但單單定義出結構體, direct3d是不能理解我們在幹嘛的,這時候,我們需要乙個巨集來傳達我們定義的頂點有哪些屬性。

比如剛剛我定義的customvertex結構體就可以通過以下方式來描述:

#define d3dfvf_customvertex (d3dfvf_xyzrhw|d3dfvf_diffuse)

#define d3dfvf_customvertex (d3dfvf_xyzrhw|d3dfvf_diffuse)
我們可以看到,結構體中有的屬性,在這個巨集定義都有著一一對應,相輔相成。

在direct3d中常用的fvf格式可以取下面這些值:

序號 標示

精析 1

d3dfvf_xyz

包含未經過座標變換的頂點座標值,不可以和d3dfvf_xyzrhw一起使用 2

d3dfvf_xyzrhw

包含經過座標變換的頂點座標值,不可以和d3dfvf_xyz以及d3dfvf_normal一起使用 3

d3dfvf_xyzb1~5

標示頂點混合的權重值,數值字尾為幾就用幾,這個屬性在後面骨骼動畫中有用到 4

d3dfvf_normal

包含法線向量的數值 5

d3dfvf_diffuse

包含漫反射的顏色值 6

d3dfvf_specular

包含鏡面反射的數值 7

d3dfvf_tex1~8

表示包含1~8個紋理座標資訊,是幾重紋理字尾就用幾,最多8層紋理

關於圍繞著這個**的講解:

其中d3dfvf_xyz和d3dfvf_xyzrhw這兩個屬性的內容重複了,可謂水火不相容,一山不容二虎,每次我們選擇其中的乙個寫出來就可以了,其中d3dfvf_xyz表示未經過座標變換的頂點,而d3dfvf_xyzrhw表示經過座標變換的頂點。

需要注意的是,我們在書寫靈活頂點格式的巨集定義的時候需要遵守乙個順序原則,順序就是優先順序需要這樣來分:

頂點座標位置》rhw值》頂點混合權重值》頂點法線向量》漫反射顏色值》鏡面反射顏色值》紋理座標資訊。

也就是說,在定義fvf巨集的時候,頂點座標位置總是排著最前面的。然後依次是rhw值,然後繼續往後排。

淺墨在製作上面這個**的時候專門為他們專門標好了序號,大家寫的時候只要按著標號的順序取自己想要的屬性,按著順序寫就可以了。

光說如果大家還是不太理解,我們舉兩個例子。

頂點結構體定義好後,配套的巨集定義需要遵守上面的約定,於是我們按順序這樣寫:

#define d3dfvf_customvertex1 (d3dfvf_xyz | d3dfvf_diffuse | d3dfvf_tex1)

#define d3dfvf_customvertex1 (d3dfvf_xyz | d3dfvf_diffuse | d3dfvf_tex1)
再舉乙個例子,依然是遵循**中的順序來寫:

#define d3dfvf_customvertex2 (d3dfvf_xyzrhw | d3dfvf_xyzb1| d3dfvf_diffuse | d3dfvf_specular | d3dfvf_tex1)

#define d3dfvf_customvertex2 (d3dfvf_xyzrhw | d3dfvf_xyzb1| d3dfvf_diffuse | d3dfvf_specular | d3dfvf_tex1)
好了,最終我們把這步整體起來看,定義頂點格式需要的**就可以這樣寫:

struct

customvertex

;#define d3dfvf_customvertex (d3dfvf_xyzrhw|d3dfvf_diffuse) //fvf靈活頂點格式

source:

D3D基本框架 即D3D標頭檔案分類

了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...

d3d矩陣變換

1.d3d的繪製流水線 區域性座標系 模型空間 世界座標系 觀察座標系 背面消隱 光照 裁剪 投影 視口變化 光柵化 每個3d模型都有自己的空間,空間的中心 原點 就是模型的中心。世界空間就是物體 模型 存在的地方。世界的中心就是原點 0,0,0 注意螢幕中間的那一點不是世界空間的中心點,螢幕中間的...

d3d矩陣總結

d3d中實現物件的基本渲染需要使用shader指令碼,而shader指令碼最低的的需求就是頂點與矩陣,在這裡主要討論矩陣 這個矩陣是3個矩陣運算得來的,分別是世界矩陣 視矩陣和投影矩陣 世界矩陣 世界矩陣就是標識者物體在世界座標系中的位置,預設下設為單位陣即可 視矩陣 視矩陣是攝像機位置和朝向的設定...