關於D3D的學習和個人理解 1

2021-05-02 12:16:19 字數 3131 閱讀 6119

w 單字 wspeed

dw 雙字 dwhitlist

*****命名規範

每個directx方法都會返回乙個 hresult 組織**,以使其可以檢查並處理所有可能的錯誤。

正題1.頂點

1.1內容

頂點即乙個3dworld中的點。

頂點 vector與jme中的math包下 vector3f相同。

分別為d3d9types.h中的 d3dvector,d3dx9math.h中增強版本向量結構d3dxvector3

1.2結構

頂點是乙個結構,他所包含的不僅僅是位置資訊,d3d執行時是以這種方式來接受資料的:

所有定點都儲存在乙個頂點緩衝器中,頂點緩衝器允許應用程式分配和訪問通常只有驅動程式才可以訪問到的儲存器。

理論上乙個頂點的結構可以理解為顏色,法線向量,紋理,紋理座標

c++碼為:

struct vertex

1.3使用朝向

描述物體的朝向至少需要4個向量 ——look,up,right,position.position向量定義了物體的位置,look向量定義了物體所指的的方向;right向量定義了物體的右側指向;up向量僅在物體會繞著look向量旋轉時才是必須的,保證旋轉過程中軸心不變 在jme中同樣有這樣的位置關係,屬於3d物體的統一定義。

例子 :

改變飛機的俯仰度 需要使其繞right向量旋轉;

飛機需要橫滾,需要對look向量旋轉;

若飛機要改變所面對的方向,需要對其繞up向量旋轉;若要使物體沿look向量方向移動,則需要改變position向量(絕對位置)。

1.4理解面

所有的模型和3d世界都可以被分解為點,線和三角形(可以稱為圖元);d3d只能渲染這些圖元(相對來說opengl和其他3d引擎有其優勢,可通過頂點渲染來構成面),若為了減少面得數量而是用4個或更多頂點的多邊形來設計形狀的話,d3d也會將每個多邊形面分割稱為一些三角形,由此為了獲得更高的效能(即減少分割時間),應該使每個物體都易於被分割為三角形.

因此,通常應使用三角形來構建物體。

而乙個由若干三角形構成的物體被稱為「網格(mesh)」;

*背面剔除是以只渲染攝像機所對的面得特性,用於提高渲染速度。

1.5理解多邊形

多邊形是指由3個或以上的頂點來構成n邊的封閉的形狀,三角形是最簡單的多邊形,而且可以保證所有定點都在乙個平面上,在d3d中構成多邊形都可以通過分解為三角形來實現。

1.6理解法線

法線是垂直於面的向量,可以用於定義乙個面得朝向或成為可見側(即需要貼圖的面,攝像機可以見的面)。

頂點法線:

乙個形的頂點的髮線通常垂直於乙個面,並且位於頂點之上,具有乙個單位的長度(即1)。

面法線:

另一類法線是面法線,通常垂直於面,並且位於面得**。d3d可以自己計算面法線。

頂點法線對於光照計算很重要,在第九章將可以學到應用高階shader語言進行shader程式設計中使用到 。

面法線和頂點法線對於著色模式(shading mode)也很重要。通常面法線使用flat著色,頂點法線則用於gouraud著色。

1.7理解法線和gouraud著色

著色是進行光照計算並根據計算結果確定畫素顏色的過程,這些畫素顏色稍後將用於螢幕上表示物體(著色是光柵器對畫素進行上色的方法)。flat著色照亮每個多邊形或免,gouraud著色照亮了每個頂點。

水壺例子。

flat著色照亮三角形,即面;

gouraud著色照亮每個頂點,可實現光滑的曲面(即經常在pspx模擬器中看到的d3d渲染和opengl渲染的區別)

兩者使用模型不同。

但在這裡要說明的紋理對映是指的一種可以對映到乙個或多個面上的特殊影象。

*個人理解:即將一張jpg或者tip,通過某種方式對進行等比例縮放和變形將其對映到某個表面或某多個表面上。電影放映機 膠片與大螢幕的關係吧,膠片就是紋理源jpg或者其他格式檔案,大螢幕就是我們要對映(投影)投影的面。放映機就是貼圖的這個過程。

為了將圖素(texel,texture element(紋理元素)的縮寫)對映到圖元上,d3d要求在紋理中對所有的圖素都使用乙個統一的位址範圍。因此他使用一種具有通用性的編址方案,其中所有的圖素位址都在區間[0.0f,1.0f]中。紋理座標空間中,u表示水平方向,v表示垂直方向。(即紋理的右下角為(1.0f,1.0f)左上角座標為(0.0f,0.0f))這裡不涉及紋理的實際尺寸,即長寬比例不為1:1一樣是這樣編址。若賦值的紋理座標超過該區間,則可以創造出某些特特殊的貼紋理效果。將會在後續學習中見到 。

最後我們需要將紋理的座標分配給乙個網格(即剛才學的由三角形構成的物體mesh)的各個頂點。因此,紋理座標可作為頂點的乙個分量被直接包含在定點結構中,如「理解頂點」一節中所示的頂點結構。

當我們要投影的圖元網格的縱橫比與紋理相同時,這種情況下 ,紋理座標(0.0,0.0),(1.0,0.0),(1.0,1.0),(0.0,1.0)被分配到圖元的各個頂點,這會使d3d縮放紋理以覆蓋整個圖元網格。分配紋理座標可能如下所示:(四邊形的四個頂點)

cvvertices [0] = ;//對應頂點的x,y,z,rhw,tu(紋理位址u),tv

cvvertices [1] = ;

cvvertices [2] = ;

cvvertices [3] = ;

這是乙個典型的頂點結構,它由位置向量,rhw(reciprocal of homogeneous w,齊次w的倒數)值和紋理的tu,tv座標組成(在後續將詳細解釋rhw)。

這裡我們重新著重解釋一下最後的兩個變數,即一對紋理位址座標。這裡我們是把紋理的所有內容,即從左上到右下的圖素全部對映到圖元網格上了。

如果我們遇到乙個縱橫比和紋理不相同的情況,這種全部貼圖方法會使長寬按照相應比例壓縮或拉伸。到時我們可以通過ps修改紋理,或者只貼紋理的一部分到網格上。

如果我們只想對映紋理的左半部份就可以設定紋理座標:(0.0,0.0),(0.5,0.0),(0.5,1.0),(0.0,1.0)分配給各個頂點。

以上只是簡單的貼圖方法,如果像我們通常在遊戲中看到的場景或者模型貼圖需要更高階的紋理對映。

當然這些我們可以通過3dsmax或者maya在製作模型時設定好。我們在使用時直接匯入模型就會有對應的紋理對映資訊了。

希望這章能夠讓我們對紋理對映,3d世界的構成有一定的認識,下章開始我們將真正接觸d3d以及d3d code。

前序工作:安裝好vs2005和dx 9.0sdk(需要安裝其中例子sample的資料夾)。

關於D3D中的顏色

1.當模型自帶顏色時,使用白色光照即可顯示出模型的本色,如果禁用光照,那麼模型就是黑色 2.當模型自帶顏色時,要通過設定material來設定模型的顏色,然後用白色光照之即可 1for dword i 0 i m dwnummtrls i 213m pmesh drawsubset i 14 15 ...

關於D3D中的顏色

1.當模型自帶顏色時,使用白色光照即可顯示出模型的本色,如果禁用光照,那麼模型就是黑色 2.當模型自帶顏色時,要通過設定material來設定模型的顏色,然後用白色光照之即可 3.有紋理的模型,一般不需要光照,因為紋理本身有顏色 4.每個模型繪製前要做好光照設定,比如禁用光照,或者指定某種顏色的光照...

D3D學習筆記(四)

光照 光照可分為環境光,漫射光,鏡面光三種 三種顏色的光均可用d3decolorvalue或d3dxcolor來表示,描述光線的顏色時,d3dxcolor中的alpha值將被忽略 材質 材質可用結構d3dmaterial9來表示 typedef struct d3dmaterial9d3dmater...