3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DirectX12 事始め スワップチェインの生成

Last updated at Posted at 2018-08-08

今回は、スワップチェインの作成をしていきます。
スワップチェインとは裏画面と表画面の切り替え役みたいなものです。
それではやっていきます。

Swap.h
#include "Obj.h
class Window;
class Queue;
class Swap : 
   public Obj
{
   public:
      // コンストラクタ
      Swap(Window* win, Queue* queue);
      // デストラクタ
      ~Swap();

      // スワップチェインの取得
      IDXGISwapChain3* Get(void) const {
         return swap;
      }
      // バックバッファの数取得
      UINT GetBack(void) const {
         return bufferCnt;
      }
   private:
      // ファクトリーの生成
      HRESULT CreateFactory(void);
      // スワップチェインの生成
      HRESULT CreateSwap(void);

      // ウィンドウ
      Window* win;
      // コマンドキュー
      Queue* queue;
      // ファクトリー
      IDXGIFactory4* factory;
      // スワップチェイン
      IDXGISwapChain3* swap;
      // バックバッファ数
      UINT bufferCnt;
};
Swap.cpp
#include "Swap.h"
#include "Window.h"
#include "Queue.h"

// コンストラクタ
Swap::Swap(Window* win, Queue* queue) : 
   win(win), queue(queue)
{
   CreateFactory();
   CreateSwap();
}
// デストラクタ
Swap::~Swap()
{
   Release(swap);
   Release(Factory);
   delete win;
   delete queue;
}
// スワップチェインファクトリーの生成
HRESULT Swap::CreateFactory(void)
{
   result = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
   return result;
}
// スワップチェインの生成
HRESULT Swap::CreateSwap(void)
{
   //スワップチェイン設定用構造体
   DXGI_SWAP_CHAIN_DESC1 desc = {};
   desc.AlphaMode   = DXGI_ALPHA_MODE_UNSPECIFIED;
   desc.BufferCount = 2;
   desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
   desc.Flags       = 0;
   desc.Format      = DXGI_FORMAT_R8G8B8A8_UNORM;
   desc.Height      = win->GetY();
   desc.SampleDesc  = { 1, 0 };
   desc.Scaling     = DXGI_SCALING_STRETCH;
   desc.Stereo      = false;
   desc.SwapEffect  = DXGI_SWAP_EFFECT_FLIP_DISCARD;
   desc.Width       = win->GetX();

   //スワップチェイン生成
   result = factory->CreateSwapChainForHwnd(queue->Get(), win->GetHandle(), 
   &desc, nullptr, nullptr, (IDXGISwapChain1**)(&swap));
   //バックバッファ数保存
   bufferCnt = desc.BufferCount;

   return result;
}
Main.cpp
//これで表・裏の入れ替え
swap->Get()->Present(1, 0);

今回は、ウィンドウハンドルからスワップチェインを作成してみました。
これで裏画面と表画面の入れ替えができるようになりました。
次回はレンダーターゲットを作成し、画面に影響を与える準備しよかな。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?