利用D3D抓取視訊記憶體資料

2021-08-22 13:35:39 字數 1478 閱讀 5779

microsoft 提供的d3d sdk是用來進行3d建模和利用gpu運算的一組介面的集合,

d3d sdk至少有兩個優點:

1、提供了一種3d建模的構架,程式設計師可以很容易的用這種構架來建模自己的3d模型

2、提供了一種gpu和cpu並行運算的解決方案,,為提**用程式的效能提供了一種思路

d3d 渲染的基本流程:

1. d3d setting states//設定渲染環境

2. g_pd3ddevice->beginscene();

3. d3d 管線渲染

4. g_pd3ddevice->endscene();

至此,d3d的渲染過程已經結束,渲染處理的最終資料被存於d3d su***ce(這是在gpu中開闢的儲存區域), 下面可以根據具體的需求來對該su***ce進行後處理:

1 直接顯示:g_pd3ddevice->present();

2 轉存到本地磁碟,即gpu to cpu的copy.

這裡給出比較常見的一種處理方法:

g_pd3ddevice->getbackbuffer(0,0,d3dbackbuffer_type_mono,&pbackbuffer);

pbackbuffer->lockrect(&source,null,0);

copy(dest,source);

pbackbuffer->unlock();

這種方法缺點很嚴重,就是由於iptrd3dsu***ce lock的記憶體是位於顯示卡中,這樣在做copy(dest,source)的時候,非常緩慢,基本無法實現實時轉存的要求。

這個方法本人試過了差不多一張1080p的需要使用50ms以上,這個速度超級慢

那microsoft有沒有提供更好的解決方案呢?

這個微軟利用了另外的方式做的

**如下:

g_pd3ddevice->getbackbuffer(0,0,d3dbackbuffer_type_mono,&pbackbuffer);

g_pd3ddevice->createoffscreenplainsu***ce(d3***.backbufferwidth,d3***.backbufferheight,d3***.backbufferformat,d3dpool_sysmem,&g_p2dsu***ce,null);

g_pd3ddevice->getrendertargetdata(pbackbuffer, g_p2dsu***ce);

g_p2dsu***ce->lockrect(&source,null,0);

copy(dest,source);

g_p2dsu***ce->unlock();

gaminganywhere用的就是上面的方式。

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

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

d3d矩陣變換

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

d3d矩陣總結

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