王朝网络
分享
 
 
 

Direct3D试玩 - 实现一个Image Render

王朝other·作者佚名  2006-05-27
宽屏版  字体: |||超大  

前些日子写了一个基于DrawDib视频函数库的Render,虽然显示图片速度非常快,但是还是难以满足一些交互式的实时显示.而且在放大缩小的时候,无法设置反锯齿功能(antialias). 本来不想用Directx的,看来现在还是逃不过. 我很讨厌用接口经常变动的东西,更讨厌需要安装支持动态链接库的东东, directx就是这样的东西,direct1到现在的directx9,每一次新接口都会变动,当然老的接口还是可以用的,但是出来相应的SDK文档却没有老接口的调用方法。没办法,down了个Directx9硬着头皮学学。

研究了一下午再加一晚上的SDK文档, 脑子里差不多有Render的框架了,大致如下:

class MMD3DRender

{

protected:

IDirect3D9* m_pD3D;

IDirect3DDevice9* m_pDev;

IDirect3DSurface9* m_pSuf;

……

//作一些Direct3D9的初始化工作

bool Init( HWND);

// 把Buffer里面的东西送到Surface上去(m_pSuf)

void Draw( BYTE* pBuffer,int iStep, LPRECT lpRc);

// WM_PAINT 消息处理

void Paint();

// 释放资源,退出的善后工作

void Destroy();

};

按道理调用这个Render很简单,只要在某个Window对象的WM_CREATE消息响应函数里面调用

Init( pWnd->GetSafeHwnd())

然后其WM_PAINT函数里加

ValidateRect(NULL);

render.Paint();

就OK了。

于是我就建立了一个MFC单视图结构(没有文档(CDocument)),往里面的CChildView插

加了OnCreate,OnPaint消息处理函数,并插入了上面的代码,可是运行并没有成功,是Init出了问题:

bool MMD3DRender::Init( HWND hWnd)

{

ASSERT(::IsWindow(hWnd));

m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );

if( !m_pD3D)

return false;

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory( &d3dpp, sizeof(d3dpp) );

d3dpp.Windowed = TRUE;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

d3dpp.hDeviceWindow = hWnd;

HRESULT hr;

if( FAILED(hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&m_pDev)))

{

SAFE_RELEASE(m_pD3D);

AfxMessageBox( DXGetErrorDescription9(hr));

return false;

}

return true;

}

上面的代码几乎和SDK文档中Tutorial里面的一模一样,可是我的程序每次到CreateDevice就Fail掉了,郁闷了半天也找不到原因,运行SDK中的例子程序却好好的,后来再SDK中看到这么一句话:

This method should not be run during the handling of WM_CREATE. An application should never pass a window handle to Direct3D while handling WM_CREATE. Any call to create, release, or reset the device must be done using the same thread as the window procedure of the focus window.

考!我一看晕倒,还有这么bt的限制啊,我就把Init代码移到了View的父窗口CMainFrame的OnCreate函数中,再创建View之后紧接着Init。

if( !m_wndView.Create(…))

g_render.Init(m_wnd.GetSafeHwnd());

这样总行了吧,考,运行之后还是错误!我又把上面改成

g_render.Init(this->GetSafeHwnd());

就是把CMainFrame的句柄传入,结果成功运行了,整个窗口被按照期望涂成了黑色,只是顺便把工具条什么的都一块涂掉了,呵呵。

想了半天,不知道什么原因,为什么CMainFrame可以,而且是在其WM_CREATE处理函数中出入句柄的,这个还是是SDK所禁止的。会不会和窗口的初始大小有关呢?我注意到m_wndView的创建函数是把其设成CRect(0,0,0,0)的,把它改成:

if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0,100, 100), this, AFX_IDW_PANE_FIRST, NULL))

ft,一运行居然OK了~将 Init放回View的OnCreate处理函数中,也顺利运行了。

看来SDK里面写的东东也不能全信,应该改成:

Direct3D9 创建Device时依赖的窗口初始大小不能为0

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有