はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング DirectX最小構成をクラス分けした話

あいさつ

どうも、はかせです。
今回は前回やるって言ってたクラス分けして
呼び出すだけで使えるようにしたやつです。

コード

全体は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の最低限の初期化は完了し
画面を黒くぬりつぶせます。

あとがき

今回は前回作ったDirectX最小構成をクラス分けし
使いやすくした話と、DirectXの初期化のうんちくでした。

確かに完全習得しようと思うとDirectXをはじめとした
低レイヤにアクセスできるAPIはむずかしいです。
ただ目的を実現するための一つのツール程度に使うならば
そこまでむずかしくはないと思います。
(めんどくさいけどw)

やってみる価値はあるとおもいますよ。

それでは今回はこの辺でノシ
今回作ったものはgithubに上げました
github.com