zoukankan      html  css  js  c++  java
  • 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的数组,并在渲染主循环中依次切换渲染,即可实现多渲染窗口结构。

  • 相关阅读:
    linux之sed用法
    个人记录-虚拟现实
    对于spark以及hadoop的几个疑问(转)
    关于老师的说的技术问题
    为什么我们总是行动不起来?你失败不是因为能力差? 如何才能实现我们的计划?
    Hibernate中一对多和多对一关系
    C# 将PDF文件转换为word格式
    C# 设置word文档页面大小
    C# 将多个office文件转换及合并为一个PDF文件
    C# 给PDF文件添加水印
  • 原文地址:https://www.cnblogs.com/konlil/p/1956653.html
Copyright © 2011-2022 走看看