分享

一个D3D设备支持多个win32窗口

 SamBookshelf 2014-03-05

    光速的完成了ProduceSystem的client和srv后,数了数,3000行,2周,一个累字了得。。。。休息了两天后,钢哥给我说,来看看聊天面板的帧动画和外置聊天窗口。- -, 最蛋疼的外置聊天窗口还是要做~~诶,之前看过一下此版本的外置窗口实现,纯WIN32 GDI~怎一个痛苦了得,帧动画到时用引擎现成的接口封装完毕~~~但是外置的就很痛苦了,于是就想,外置的窗口不都是win32吗,好,改成3D窗口的试试,改成了,就可以用现成的底层引擎支持~~~~~。

    刚开始,看了看源代码,看到了 由游戏的主WinMain传入进来的hWnd和hInstance建立了一个wc窗口风格,然后下面的就是直接调用API Creat(...); 来创建的窗口,看看了Creat的返回参数,OK ,  HWND, 保存了这个返回值在用 

 // 初始化3D窗口
 if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  return false;

 

 if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
           D3DDEVTYPE_HAL,
           m_hWnd,
           D3DCREATE_HARDWARE_VERTEXPROCESSING,
           &d3dpp, 
           &gTalkDecvice ) ) )
 {
  return false;
 }

 

OK, 顺利成功,直接顺利渲染出3D窗口,但是过程万多不容易。。。。啊,但是貌似引擎底层是主游戏里的D3Ddevice来初始化很多资源的,怎么办?外部的gTalkDecvice 根本就不用。。。

   达人出现,一开发引擎的同事给我说就用主游戏里的D3Ddevice来渲染外部窗口~~ (这么凶?)。。。上代码:

 

 // .h

 IDirect3DSwapChain9     *m_pD3dSwapChain9;

 

// .cpp

 

    D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory( &d3dpp, sizeof(d3dpp) );
 d3dpp.Windowed = TRUE;
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
 d3dpp.hDeviceWindow = m_hWnd;  // 这里很重要,之前没有写这里

 

 GetD3dDevice()->CreateAdditionalSwapChain( &d3dpp, &m_pD3dSwapChain9 );
 if ( !m_pD3dSwapChain9 )
 {
  return false;
 }

// 渲染

// GetD3dDevice() 获取主游戏3D设备句柄

     if( NULL == m_pD3dSwapChain9 )
      return 0;

 
     IDirect3DSurface9 *pTempD3dSurface9 = NULL;
     IDirect3DSurface9 *pTempOldD3dSurface9 = NULL;
     m_pD3dSwapChain9->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pTempD3dSurface9 );
     GetD3dDevice()->GetRenderTarget( 0, &pTempOldD3dSurface9 );
     if (  NULL == pTempD3dSurface9 || NULL==pTempOldD3dSurface9 )
     {
      return 0;
     }
     GetD3dDevice()->SetRenderTarget( 0, pTempD3dSurface9 );
     
     GetD3dDevice()->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(221,2,2), 1.0f, 0 );
     if( SUCCEEDED( GetD3dDevice()->BeginScene() ) )
     {

      GetD3dDevice()->EndScene();
     }

     m_pD3dSwapChain9->Present( NULL, NULL, NULL, NULL, NULL);

     pTempD3dSurface9->Release();
     pTempD3dSurface9=NULL;
     
     GetD3dDevice()->SetRenderTarget( 0, pTempOldD3dSurface9 );
     pTempOldD3dSurface9->Release();
     pTempOldD3dSurface9=NULL;

 

  哦也,顺利在外部窗口上渲染出3D界面,而引擎现在也可以使用部分套件,移植GUI。。努力,膜拜达人同事+1.hehe,我们游戏的外置窗口一定要比其它游戏丰富了!呵呵

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多