DXGI -> Direct3D11 - 画面クリアできるくらいまで

公開:2011-07-02 21:08
更新:2020-02-15 04:36
カテゴリ:directx,dxgi,windows,c++

とりあえず画面クリアまでのコードを書いた。

RenderTargetViewを作れば画面クリアができるようになる。RenderTargetView作成に至るまでの各インターフェースの関係などまだ理解していない部分がかなりある。以下初期化部分のコード。



virtual void create_device(){
    HRESULT hr = S_OK;

    //ウィンドウの現在の幅、高さを求める
    //RECT rc;
    //GetClientRect( hwnd_, &rc );
    //uint32_t width = rc.right - rc.left;
    //uint32_t height = rc.bottom - rc.top;

    // アダプタデバイス情報の取得
    //LARGE_INTEGER version;
    THROW_IFERR(dxgi_factory_->EnumAdapters1(0,&adapter_));
    //THROW_IFERR(adapter_->CheckInterfaceSupport( __uuidof(ID3D10Device),&version));


    // D3DDeviceの作成

    std::vector<D3D_FEATURE_LEVEL> feature_levels = 
      boost::assign::list_of<D3D_FEATURE_LEVEL>
      (D3D_FEATURE_LEVEL_11_0 )        // DirectX11対応GPU
      (D3D_FEATURE_LEVEL_10_1)        // DirectX10.1対応GPU
      (D3D_FEATURE_LEVEL_10_0 );       // DirectX10対応GPU

    D3D_FEATURE_LEVEL level;
    THROW_IFERR(::D3D11CreateDevice(
      adapter_,
      D3D_DRIVER_TYPE_UNKNOWN ,
      NULL,
      D3D11_CREATE_DEVICE_BGRA_SUPPORT,
      &feature_levels[0],
      feature_levels.size(),
      D3D11_SDK_VERSION,
      &d3d_device_,
      &level,
      &d3d_context_));

    THROW_IFERR(adapter_->EnumOutputs(0,&output_));

    // 表示モード
    DXGI_MODE_DESC desired_desc = {} , actual_desc = {};
    // 各色8ビットで符号化なし正規化数
    desired_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    desired_desc.Height = 480;// 高さ
    desired_desc.Width = 640;// 幅
    desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし
    // リフレッシュレートを60Hzを要求する
    desired_desc.RefreshRate.Numerator = 60000;
    desired_desc.RefreshRate.Denominator = 1000;
    // 近いモードを検索
    output_->FindClosestMatchingMode(&desired_desc,&actual_desc,d3d_device_);

    // スワップチェーンの作成
    {
      DXGI_SWAP_CHAIN_DESC desc = {};

      desc.BufferDesc = actual_desc;
      desc.SampleDesc.Count    = 1;
      desc.BufferUsage            = DXGI_USAGE_RENDER_TARGET_OUTPUT;
      desc.BufferCount            = 1;
      desc.OutputWindow        = hwnd_;
      desc.SwapEffect            = DXGI_SWAP_EFFECT_DISCARD;
      desc.Windowed            = TRUE;
      desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

      THROW_IFERR(dxgi_factory_->CreateSwapChain(d3d_device_,&desc,&swap_chain_));

    }

    // ビューの作成
    THROW_IFERR(swap_chain_->GetBuffer(0,texture_.GetIID(),(void**)&texture_));
    THROW_IFERR(d3d_device_->CreateRenderTargetView(texture_,0,&view_));
  }

もうちょっとでポリゴンを描けるようになる。

ソースコード全体