今回は、スワップチェインの作成をしていきます。
スワップチェインとは裏画面と表画面の切り替え役みたいなものです。
それではやっていきます。
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);
今回は、ウィンドウハンドルからスワップチェインを作成してみました。
これで裏画面と表画面の入れ替えができるようになりました。
次回はレンダーターゲットを作成し、画面に影響を与える準備しよかな。