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中採用的多重取樣方法。即在每個畫素點內部,設定多個取樣點,繪製多邊形邊緣時,針對每個取樣點判斷是否被多邊形覆蓋,最終的顏色值從取樣點中取均值,以對多邊形的邊緣進行 模糊化 從而減輕鋸齒效果...