1.direct3d通常建立2~3個表面組成乙個集合,即為交換鏈,通常由idirect3dswapchain介面來表示。我們不必去了解它更詳細的細節。我們也很少去管理它,通常direct3d會自己去管理。所以我們只要大概的了解一下它就可以了。
交換鏈以及頁面切換技巧被用在使兩幀動畫之間過度更平滑。
在front buffer中的表面將用來在螢幕上顯示。顯示器不能即時顯示front buffer中表示的影象;通常情況下,它是每六十分之一秒重新整理顯示一次,即重新整理率為60赫茲。應用程式的幀率經常與監視器的重新整理率不同步(比如應用程式的渲染幀速度可能比顯示器的重新整理速度快)。然而,我們不能在顯示器顯示完成當前幀之前就更新有下一幀動畫的front buffer內容,但是我們又不想讓程式停止渲染而去等待顯示器顯示。因此,我們渲染另乙個螢幕表面back buffer。當監視器將front buffer顯示出來後,front buffer就被放到交換鏈的末端,即變成圖中的back buffer,而back buffer就會變成交換鏈中的front buffer。這個過程就叫做presenting。(是否就對應了idirect3ddevice::present(null, null, null, null))。
注:在實際使用過程中,發現,不能多次呼叫present,因為這會影響幀率。常用的做法是,在做完了所有準備工作後,只用呼叫一次。
2.為頂點格式宣告的fvf組合標誌的順序必須要和頂點結構的順序一一對應。
例如:struct normaltexvertex
;則宣告fvf格式為
#define fvf_normal_tex (d3dfvf_xyz | d3dfvf_normal | d3dfvf_tex1)
3.光照定義在世界座標系中,但必須變換到檢視座標系才可使用
4.direct3d中預設頂點以順時針方向(在觀察座標系中)形成的三角形為正面,以逆時針方向形成的三角形為背面。
正面多邊形擋住了在它後面的背面多邊形,direct3d將通過消除(即刪除多餘的處理過程)背面多邊形來提高效率,這種方法就叫backface culling。
如果我們不想使用預設繪製狀態,我們可以通過改變d3drs_cullmode來改變渲染狀態:
device->setrenderstate(d3drs_cullmode, value);
value可以是如下乙個值:
d3dcull_none——完全不使用背面消除
d3dcull_cw——消除順時針方向環繞的三角形
d3dcull_ccw——消除逆時針方向環繞的三角形,這是預設值。
5.我們刪除那些超出了可視體範圍的幾何圖形的過程就叫做裁剪(clipping)
6.投影變換的實質就是定義可視體,並將可視體內的幾何圖形投影到投影視窗上去。
aspect引數為投影平面的寬高比例值,由於最後都為轉換到螢幕上,所以這個比例一般設為螢幕解析度的寬和高的比值(而在dxsdk中則經常會看到ms會推薦d3dx_pi/4和1:1作為投影變換矩陣的fov和aspect數值,但是在實際的程式設計中,卻不太這麼做,至少我個人大多數都是使用螢幕解析度的寬高比和d3dx_pi/2)。如果投影視窗是個正方形,而我們的顯示屏一般都是長方形的,這樣轉換後就會引起拉伸變形。
7.視口變換(viewport transform)主要是轉換投影視窗到顯示螢幕上。通常乙個遊戲的視口就是整個顯示屏,但是當我們以視窗模式執行的時候,也有可能只佔螢幕的一部分或在客戶區內。視口矩形是由它所在視窗的座標系來描述的。
DirectX入門知識點 2
在進行directx開發的時候,有時候會碰到一些編譯錯誤,其中有一部分是由於某些directx sdk和windows platform sdk衝突的原因。例如,error c2146 syntax error missing before identifier pvoid64 就是說pvoid64...
ADXL345入門知識點(1)
adxl345是3軸加速度計。體型 3 mm 5 mm 1 mm,14根引腳。方向性首先得要明白,如圖所示 那麼,什麼情況下才算是正的加速度呢?當檢測軸的方向和中立的方向相反時檢測到的是正的加速度。用圖說明最方便 那麼14根引腳都是用來做什麼用的呢?我們看圖說話 結合之前的圖示,從中間顯示的各個方向...
python入門知識點
人生苦短,我用python。廢話不多說,記錄一下python基礎知識點。lambda函式 lambda 引數 返回值 map函式 map function,引數序列 將制定序列中所有元素作為引數呼叫制定函式 filter函式 filter function,引數序列 將制定序列中所有元素作為引數呼叫...