あいさつ
どうも、はかせです。
今回は前回やるって言ってたクラス分けして
呼び出すだけで使えるようにしたやつです。
コード
全体はgithubに上げたのでここでは前回との差分をば。
//ウィンドウの横幅 static const UINT WindowWidth = 1000; //ウィンドウの縦幅 static const UINT WindowHeight = 800;
前回メインに置いていた縦横の値は
static constでヘッダーに置いてみました。
というのも縦横の値ってDirectXの各所で使うので
わざわざクラスインスタンスを使って参照するのは
無駄が多い気がしたからです。
DXManager::DXManager(HWND hwnd)
{
/*スワップチェインの設定*/
DXGI_SWAP_CHAIN_DESC swapChain = { 0 };
swapChain.BufferDesc.Width = WindowWidth;
swapChain.BufferDesc.Height = WindowHeight;
swapChain.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChain.BufferDesc.RefreshRate.Numerator = 60;
swapChain.BufferDesc.RefreshRate.Denominator = 1;
swapChain.SampleDesc.Count = 1;
swapChain.SampleDesc.Quality = 0;
swapChain.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChain.BufferCount = 1;
swapChain.OutputWindow = hwnd;
swapChain.Windowed = TRUE;
D3D_FEATURE_LEVEL fl = D3D_FEATURE_LEVEL_11_0;
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &fl, 1, D3D11_SDK_VERSION, &swapChain, &mSwapChain, &mDevice, NULL, &mDeviceContext);
//描画先の設定
ID3D11Texture2D *renderTexture;
mSwapChain.Get()->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&renderTexture);
mDevice->CreateRenderTargetView(renderTexture, NULL, &mRenderTargetView);
renderTexture->Release();
float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
mClearColor = clearColor;
}
void DXManager::Update()
{
// DirectXのループ処理
mDeviceContext->ClearRenderTargetView(mRenderTargetView.Get(), mClearColor);
mSwapChain.Get()->Present(0, 0);
}
DirectXの部分だけまとめたものです。
コンストラクタで初期化を行い、
必要なタイミングでUpdateを呼ぶことでDirectXのループを実行します。
私のブログであまりDirectX初期化のくだりの話をしたことがなかったので少しだけ。
今回の初期化では大きく分けて二つの処理をしています。
・スワップチェインの作成
・描画先の設定
スワップチェインっていうのはレンダリング処理を行うバッファの集まりのことです。
ここに必要な値を入れてDrawなりPresentなりすることで描画されます。
(ものすごく大雑把に言うと)
ここでは描画する際のリフレッシュレートや画面の大きさ、
他にも表示フォーマットなど色んな設定を行っています。
各種詳細はリファレンスをどうぞ
docs.microsoft.com
描画先の設定っていうのは
レンダーターゲットビューというものを設定しています。
レンダーターゲットビューは
バックバッファではなく中間バッファにレンダリングを
行うことでポストプロセス等の効果をかけたりできるようにするものです。
じゃその作り方なんですが、単純に2DTextureを作って、
そこをレンダーターゲットビューとしてあてがっているだけです。
すごく簡単そうですし、実際簡単です。
ただこれだけでDirectXの最低限の初期化は完了し
画面を黒くぬりつぶせます。