OLE控制項在Direct3D中的渲染方法

2021-08-22 14:36:59 字數 1740 閱讀 2069

windows上的圖形繪製是基於gdi的, 而direct3d並不是, 所以, 要在3d視窗中顯示一些windows中的控制項會有很多問題

那麼, 有什麼辦法讓gdi繪製的內容在3d中顯示出來?反正都是影象, 總有辦法實現的嘛!

前段時間在研究瀏覽器在遊戲中的嵌入,基本的思路就是在後台開啟乙個瀏覽視窗, 然後把它顯示的內容拷貝到一張紋理上, 再把紋理在d3d中繪製出來, 至於事件處理就要另做文章了.

所以, 其它的windows裡的gdi繪製的東西都可以這樣來實現!

最初我是getdc, 然後getpixel逐畫素拷貝, 慢得我想死.....

後來發現了bitblt這一速度很快的複製方法, 才有了實用價值:

1. 取得控制項的dc: getdc(hwnd)

2. 取得texture的dc: idirect3dsu***ce9::getdc

3. 用bitblt拷貝過去

boolbitblt(

hdchdcdest,

//handletodestinationdc

intnxdest,

//x-coordofdestinationupper-leftcorner

intnydest,

//y-coordofdestinationupper-leftcorner

intnwidth,

//widthofdestinationrectangle

intnheight,

//heightofdestinationrectangle

hdchdcsrc,

//handletosourcedc

intnxsrc,

//x-coordinateofsourceupper-leftcorner

intnysrc,

//y-coordinateofsourceupper-leftcorner

dworddwrop

//rasteroperationcode);

如果是ole控制項那就更簡單啦:

winoleapioledraw(

iunknown

*punk,

//pointertotheviewobjecttobedrawn

dworddwaspect,

//howtheobjectistoberepresented

hdchdcdraw,

//devicecontextonwhichtodraw

lpcrectlprcbounds

//pointertotherectangleinwhichtheobject

//isdrawn);

比如我有乙個iwebbrowser2的指標, 想把它顯示的內容拷貝到紋理上, 可以這麼幹:

idirect3dsu***ce9

*psu***ce

=null;

this

->

mtexture

->

getsu***celevel(0,

&psu***ce);

if(null

!=psu***ce)

show一下:

不光是瀏覽器啦, 任何ole控制項都可以, 可以發揮你的想像力:

Direct3D中的霧化效果

在direct3d 中,霧化是通過將景物顏色與霧的顏色,以隨物體到觀察點距離增加而衰減的混合因子混合而實現的。兩種霧化方法 頂點霧化和畫素霧化。三種霧化公式 線性霧化,指數霧化,指數平方霧化。兩種霧化處理 基於深度的霧化處理和基於範圍的霧化處理。基於深度是指兩個點之間的深度 z 差值,基於範圍則是兩...

Direct3D入門 一 配置Direct3D環境

b url 先鋒隊 北京貝武易科技公司 b 我們要編寫directx direct3d 程式,需要先安裝兩個檔案 directx sdk directx開發包 這個開發包大,大概500兆 url 執行環境 這個檔案小,大概30 40兆 url 很多初學者會混淆了這個兩個directx有什麼區別。乙個...

Direct3D 多重取樣抗鋸齒

多重取樣抗鋸齒 multisampling atialiasing 針對光柵化顯示器抗鋸齒的方法有多種,在d3d中採用的多重取樣方法。即在每個畫素點內部,設定多個取樣點,繪製多邊形邊緣時,針對每個取樣點判斷是否被多邊形覆蓋,最終的顏色值從取樣點中取均值,以對多邊形的邊緣進行 模糊化 從而減輕鋸齒效果...