今回はDirectX11での画面のクリアとフリップについて記載していきます。
実装部分には前回の初期化の続きになるので、DirectX11クラスはそちらをご確認ください。
では早速みていきましょう!
SwapChain
前回の記事で生成した部分にはなりますが、DirectXにはスワップチェインと呼ばれるものがあります。
スワップチェインとは、画面の更新を制御する仕組みです。
例えば、60FPSで画面を更新するといった更新タイミングの制御等を行っています。
バックバッファ
スワップチェインは、フロントバッファとバックバッファの2つの絵を管理しています。
フロントバッファは名前の通り前に出ているバッファで実際の画面に表示されている内容となります。
バックバッファは裏に隠れている絵を指しており、ここに描画をしていくことで次のフレームに表示する絵を作り上げていきます。
この2つのバッファを交互に切り替えて画面をパラパラ漫画のように更新することでDirectXでは画面を動かしています。
SwapChainによる画面更新
今回はこのスワップチェインを利用した画面の更新を作成していきます。
スワップチェインではRenderTargetという描画するターゲット(画面)の情報を保持しています。
先ずはSwapChainからRenderTargetの情報を取り出す仕組みを実装してみましょう。
DirectX11.h
// DirectX11クラス
class DirectX11
{
public:
DirectX11();
~DirectX11();
// 初期化
bool Initialize(Window& window);
// 解放
void Finalize();
public:
// デバイスの取得
ID3D11Device* GetDevice() { return m_pDevice; }
// デバイスコンテキストの取得
ID3D11DeviceContext* GetContext() { return m_pDeviceContext; }
// スワップチェインの取得
IDXGISwapChain* GetSwapChain() { return m_pSwapChain; }
// レンダーターゲットの取得
ID3D11RenderTargetView* GetRenderTargetView() { return m_pRenderTargetView; }
private:
private:
ID3D11Device* m_pDevice; // DirectX11のデバイス
ID3D11DeviceContext* m_pDeviceContext; // 描画用のデバイスコンテキスト
IDXGISwapChain* m_pSwapChain; // 画面出力用のスワップチェイン
ID3D11RenderTargetView* m_pRenderTargetView; // 画面出力用のレンダーターゲット
};
DirectX11.cpp
// 初期化
bool DirectX11::Initialize(SimpleWindow& window)
{
// ~ ここまで前回の記事のコード ~
// レンダーバッファの取得
ID3D11Texture2D* pBuffer;
if (FAILED(m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBuffer)))
{
Finalize();
return false;
}
// レンダーターゲットビューの生成
if (FAILED(m_pDevice->CreateRenderTargetView(pBuffer, NULL, &m_pRenderTargetView)))
{
Finalize();
return false;
}
SafeRelease(pBuffer);
return true;
}
// 終了処理
void DirectX11::Finalize(void)
{
SafeRelease(m_pDevice);
SafeRelease(m_pDeviceContext);
SafeRelease(m_pSwapChain);
SafeRelease(m_pRenderTargetView);
}
太字になっている箇所が追加部分になります。
これで画面の内容を管理するRenderTargetViewが取得できるようになりました。
今回出て来たものは以下の2つとなります。
ID3D11Texture2D
2Dの絵を管理するためのオブジェクトです。
SwapChainから取り出した場合は画面に表示する内容を管理するTextureを取り出す事が出来ます。
ID3D11RenderTargetView
ID3D11Texture2DからCreateRenderTargetViewというものを生成しています。
これは画面に出力する際に必要なオブジェクトとなります。
DirectX11で描画をする際には必ずRenderTargetViewを介して描画する形になります。