DirectX11の初期化
Windowの生成などは別の記事で行っているのでその辺りは割愛します。
最後にサンプルもアップしているのでそちらを参考にしてください。
ではここからDirectX11の初期化のプログラムを書いていきます。
先ずはDirectX11.cppとDirectX11.hを作成しましょう。
DirectX11.h
#pragma once
#include "Window.h"
// DirectX11のヘッダーを含める
#include <d3d11.h>
// 解放用テンプレート関数
template<class T>
void SafeRelease(T*& p)
{
if (p)
{
p->Release();
p = nullptr;
}
}
// DirectX11クラス
class DirectX11
{
public:
DirectX11(void);
~DirectX11(void);
// 初期化
bool Initialize(SimpleWindow& window);
// 終了処理
void Finalize(void);
public:
// デバイスの取得
ID3D11Device* GetDevice(void) { return m_pDevice; }
// デバイスコンテキストの取得
ID3D11DeviceContext* GetContext(void) { return m_pDeviceContext; }
// スワップチェインの取得
IDXGISwapChain* GetSwapChain(void) { return m_pSwapChain; }
private:
ID3D11Device* m_pDevice; // DirectX11のデバイス
ID3D11DeviceContext* m_pDeviceContext; // 描画用のデバイスコンテキスト
IDXGISwapChain* m_pSwapChain; // 画面出力用のスワップチェイン
};
DirectX9の時と同様にSafeReleaseという解放用の関数を用意しています。
今回はマクロではなくテンプレートで実装しています。
DirectX9と同様にDirectX11のクラスもIUnknownインターフェイスを継承しています。
IUnknownインターフェイスは参照カウンタで生存管理をしています。
なので正しく解放が行っていない場合はDirectXが解放されずに残ってしまいます。
又、Release関数で解放処理を行っているのでdelete等で直接解放してはいけません。
DirectX11.cpp
#include "DirectX11.h"
// DirectX11のライブラリをリンク
#pragma comment(lib, "d3d11.lib")
DirectX11::DirectX11(void)
: m_pDevice(nullptr)
, m_pDeviceContext(nullptr)
, m_pSwapChain(nullptr)
{}
DirectX11::~DirectX11(void)
{}
// 初期化
bool DirectX11::Initialize(SimpleWindow& window)
{
DXGI_SWAP_CHAIN_DESC desc{};
// バッファ情報の設定
desc.BufferCount = 1;
desc.BufferDesc.Width = window.GetWidth();
desc.BufferDesc.Height = window.GetHeight();
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.BufferDesc.RefreshRate.Numerator = 60;
desc.BufferDesc.RefreshRate.Denominator = 1;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
// MSAAの設定
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
// ウィンドウ設定
desc.Windowed = true;
desc.OutputWindow = window.GetHandle();
// 機能レベル
const D3D_FEATURE_LEVEL FeatureLevels[] =
{
D3D_FEATURE_LEVEL_11_0, // DirectX 11.0
//D3D_FEATURE_LEVEL_10_1, // DirectX 10.1
//D3D_FEATURE_LEVEL_10_0, // DirectX 10.0
};
UINT NumFeatureLevels = ARRAYSIZE(FeatureLevels);
D3D_FEATURE_LEVEL level;
HRESULT hr;
// デバイスを作成
hr = D3D11CreateDeviceAndSwapChain(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
FeatureLevels,
NumFeatureLevels,
D3D11_SDK_VERSION,
&desc,
&m_pSwapChain,
&m_pDevice,
&level,
&m_pDeviceContext
);
if (FAILED(hr))
{
return false;
}
return true;
}
// 終了処理
void DirectX11::Finalize(void)
{
SafeRelease(m_pDevice);
SafeRelease(m_pDeviceContext);
SafeRelease(m_pSwapChain);
}
DirectX11の初期化に必要な手順は1つだけです。
それはD3D11CreateDeviceAndSwapChainを呼び出すことです!
SwapChainを自分で作成する場合はD3D11CreateDevice方法もありますが、基本的にSwapChainも一緒に作成して問題ありません。