1.4.2 使用 direct3d 繪製圖元
頂點快取是乙個direct3d物件,它可以按照direct3d格式儲存幾何圖形資料。
使用使用者指標在螢幕上繪製圖元或圖元組,呼叫direct3d裝置物件中的drawprimitive() 函式
drawprimitive() 函式原型
hresult drawprimitiveup
( d3dprimitivetype primitivetype,
uint primitivecount,
count voil* pvertexstreamzerodata,
uint vertexstreamzerostride
);
drawprimitiveup()函式:
包括要繪製的:圖元型別、圖元數量
儲存要繪製的:資料陣列、頂點流大小
第乙個引數是圖元型別:
如果要繪製一些點,將引數設為 d3dpt_pointlist
如果要繪製一些線段,將引數設為 d3dpt_linelist(例如:點1和點2連線,點3和點4連線)
如果要繪製連線線段,將引數設為 d3dpt_linestrip(例如:點1和點2相連,點2和點3相連)
如果要繪製一些離散的三角形,將引數設為 d3dpt_********list(例如:點1、點2、點3構成乙個三角形,而點4、點5、點6構成另乙個三角形)
如果要繪製一些相連的三角形,將引數設為 d3dpt_********strip(例如:點1、點2、點3構成乙個三角形,而點2、點3和點4構成另乙個三角形);也可以設為 d3dpt_********fan(例如:點1、點2、點3構成乙個三角形,而點1、點3和點4構成另乙個三角形)
當處理三角形時,所選的三角形型別取決於將資料傳送給渲染api的方式。
第二個引數是傳送給該函式的圖元總數。
如果要繪製10個三角形,將引數設為10。
第三個引數是傳送給該函式的圖元資料陣列。
第四個引數和最後乙個引數是每個頂點的大小(單位:位元組)。
1.4.3 direct3d 頂點快取
頂點快取是 lpdirect3dvertexbuffer9 型別的結構。
該結構是 ldirect3dvertexbuffer9 的指標。
呼叫 direct3d物件裝置的 createvertexbuffer() 函式可以建立頂點快取。
createvertexbuffer()函式模型:
hresult createvertexbuffer
(uint length,
dword usage, dword fvf, d3dpool pool,
idirect3dvertexbuffer9*
* ppvertexbuffer,
handle* psharedhandle)
;
createvertexbuffer()函式:
第乙個引數是頂點快取所需的位元組數。該值是正確儲存一組幾何圖形(例:人物模型、級別等)所需的最大數量(單位:位元組)。
第二個引數是乙個描述頂點快取使用方法的識別符號,可設為0。
第三個引數是乙個描述使用頂點快取的頂點結構的識別符號或識別符號集。
第四個引數是放置資源的正確記憶體類。
第五個引數是頂點快取(lpdirect3dvertexbuffer9 型別),函式是否成功決定了是否可以建立該快取。createvertexbuffer()函式中的第乙個引數為保留引數,值總是為0。
建立頂點快取後,需要鎖定頂點快取。
呼叫頂點快取的lock()函式就可以獲取頂點快取指標,從而把資料複製給該頂點快取。
lock()函式將鎖定一列資料。引數包括:為上鎖的頂點快取增加的偏移量(0代表鎖定全部快取)、要鎖定的資料量、指向鎖定記憶體區的指標以及乙個指定鎖存資料方法的識別符號。
將資料複製到快取的最簡單方法是使用標準函式 memcpy()。
一旦複製完資料,就可以呼叫unlock()。每呼叫一次lock()函式就必須相應的呼叫一次unlock()函式。
1.5 演示程式
1.5.1 lines演示程式
#include
//direct3d標頭檔案,包括direct3d函式和結構。
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#define window_class "ugpdx"
//視窗類名稱
#define window_name "drawing lines"
//視窗標題
// function prototypes...
bool
initialized3d
(hwnd hwnd,
bool fullscreen)
;//設定和建立 direct3d
bool
initializeobjects()
;//建立繪製在螢幕上的物體
void
renderscene()
;//在螢幕上渲染圖形
void
shutdown()
;//退出時清除程式
// direct3d object and device. ①
lpdirect3d9 g_d3d =
null
;lpdirect3ddevice9 g_d3ddevice =
null
;// vertex buffer to hold the geometry.
lpdirect3dvertexbuffer9 g_vertexbuffer =
null
;// a structure for our custom vertex type ②
struct std3dvertex
;// our custom fvf, which describes our custom vertex structure. ③
#define d3dfvf_vertex (d3dfvf_xyzrhw | d3dfvf_diffuse)
①
函式原型後面宣告了乙個頂點快取物件。該頂點快取用於儲存要在螢幕上顯示的幾何圖形資料。
由於該物件使用動態記憶體儲存資料,所以在程式退出前必須在程式的某個地方施放它。
這些記憶體中未施放的四處浮動的物件會產生很嚴重的記憶體洩漏問題。如果有許多儲存大量資料的頂點快取,那麼這個問題尤為突出。
②頂點快取後面是乙個定義場景中單個3d點的結構。
該店結構由位置和顏色組成。演示程式中是白色,所以點的圖案背景是白色的。
③最後一行是頂點格式識別符號。該頂點格式也可稱為靈活頂點格式(fvf:flexible vertex format)。
direct3d通過該識別符號可以知道頂點(或點)結構格式。
該結構指定了頂點的位置和顏色。
因此,還必須指定要處理包含座標(d3dfvf_xyz)和顏色(d3dfvf_diffuse)的點的頂點格式。
initializeobjects()函式的全部**
bool
initializeobjects()
,,,,
};// create the vertex buffer. ②if(
failed
(g_d3ddevice-
>
createvertexbuffer
(sizeof
(objdata),0
, d3dfvf_vertex, d3dpool_default,
&g_vertexbuffer,
null))
)return
false
;// fill the vertex buffer. ③
void
*ptr;if(
failed
(g_vertexbuffer-
>
lock(0
,sizeof
(objdata),(
void**
)&ptr,0)
))return
false
;memcpy
(ptr, objdata,
sizeof
(objdata));
g_vertexbuffer-
>
unlock()
;return
true
;}
①
為了建立兩條線段,需要指定四個點。前兩個點構成一條線段,後兩個點構成另一條線段。並指定每個點的x、y、z座標位置和顏色值。這和頂點結構以及頂點fvf完全符合。
②計算完資料後,建立頂點快取儲存資料。呼叫 createvertexbuffer()函式可以建立頂點快取。
該函式的引數包括:要儲存的物件大小、
指定使用方式的識別符號(其使用方式可以是 d3dusage 列舉變數中的任意值)、
描述頂點資料布局(d3dfvf_vertex)的頂點格式、
可以是d3dpool列舉變數中任意值的池識別符號(該識別符號指定了記憶體中放置資源的正確位置)
以及通過呼叫該函式建立的頂點快取。
最後乙個引數為保留引數,通常設為null。
③一旦完成頂點快取的分配,就將資料複製到頂點快取中。
首先,呼叫lock()函式鎖定頂點快取。lock函式可以獲取乙個指向頂點快取中已分配記憶體的指標,這樣就可以操作該指標。
ubuntu 3D桌面演示!
這幾天裝上ubuntu 了也來感受下linux 目前使用一切正常 本文就是ubuntu 下發的!目前感受最深的就是compiz fusion的 3d 桌面太nb了。相比之下vista的效果就太寒顫了。由於還沒找到linux 錄製軟體 先發個youtube 裡的效果 lisker 的桌面都完全可以做到...
CF915D 解題報告
此題目洛谷評分錯誤,根本沒有紫題難度。最開始的想法 列舉刪除的每一條邊,做一遍拓撲排序,最後直接暴力得出答案。但是,仔細分析時間複雜度 o m n m 根本過不去,所以想優化。我們可以發現,當有 x 條邊是指向 u 時,我們在上面的演算法流程中就會把每一條邊都列舉一次,列舉 x 次。但仔細想想,對於...
D3D基本框架 即D3D標頭檔案分類
了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...