d3d多渲染窗口结构
使用d3d的交换链可以方便的实现多渲染窗口结构,类的层次结构如下图所示:
D3DRes用来定义dx设备丢失的处理,所有需要关心设备丢失的资源都从此类继承,然后重写设备丢失回调函数和设备重置回调函数即可方便的处理设备丢失。
RenderTarget用来定义基本的渲染目标,成员包括长宽及大小的定义,及渲染目标的虚接口定义(比如:缓冲区切换等)。
Win32Window封装win32接口,传入配置参数创建并注册windows窗口,并定义消息处理回调,利用监听器或者事件机制向外部应用层传递鼠标键盘操作。
RenderWindow从D3DRes及RenderTarget继承,并聚合Win32Window对象,表示一个可渲染的窗口。在RenderWindow创建的时候,根据外部传入的D3D对象(IDirect3D9)创建D3D Device;有了D3D Device,对于主窗口可通过接口函数GetSwapChain获取Device的SwapChain对象,代码如下:
IDirect3DSwapChain9* pSwapChain = 0;
if( d3d_device) {
d3d_device->GetSwapChain(0, &pSwapChain);
}
对于非主窗口,则需要利用Device的接口CreateAdditionalSwapChain来创建更多的交换链对象,此接口需要硬件支持,因此创建之前需要检查硬件设备能力。 准备好RenderWindow的交换链对象后,在渲染帧即可调用Present接口驱动硬件渲染:
void RenderWindow::SwapBuffers() {
LPDIRECT3DDEVICE9 d3d_device = Graphics::Inst()->GetD3DDevice();
if(d3d_device) {
if (D3DERR_DEVICELOST == mSwapChain->Present(NULL, NULL, mhWnd, NULL, 0))
{
this->ResetDevice();
}
}
}
———-分割线—————
应用层通过创建并管理一个RenderWindow的数组,并在渲染主循环中依次切换渲染,即可实现多渲染窗口结构。