MMDモデルを使用したデスクトップユーティリティの開発 その2 DirectXデバイスの初期化

前: [その1](http://qiita.com/JI1LDG/items/6a50e2eb7751f02ffe50)
次: [その3](http://qiita.com/JI1LDG/items/f7d759612c7296def79a)
閲覧、ストックありがとうございます。拙い文章・内容ですが、よろしくお願いします。
3DCGなどを専攻して学んでいるわけではないので、その点はご了承いただきたいです。

##今回やること
MMDモデルの表示の準備のため、DirectXの初期化
[今回のソース](https://github.com/JI1LDG/ModelViewer/tree/9da064ea406971badc5e718cede70f9dfaf12f53)

##環境
VisualStudio2015 Community / SlimDX(DirectX11)
SlimDXはDirectXのC#ラッパライブラリです。
[こちら](http://memeplex.blog.shinobi.jp/directx11/c-%E3%81%A7directx11%E5%85%A5%E9%96%80%E4%B8%80%E8%A6%A7%20-slimdx%E5%85%A5%E9%96%80-)を参考にしながら、開発していきます。

##DirectXデバイスの初期化
###開発準備
1. VisualStudioを起動し、Windowsフォームアプリケーションでプロジェクトを作成する。
2. NugetからSlimDXをインストールする。
3. "Core.cs"を追加し、以下のコードを記述する。
4. プロジェクトから"form1.cs"を削除し、以下のように"Program.cs"を書き換える。


```csharp:Core.cs
using SlimDX.Windows;
using System.Windows.Forms;

namespace ModelViewer {
	class Core : Form {
		public void Run() {
			MessagePump.Run(this, Draw);
		}

		protected virtual void Draw() {
			//描画処理
		}
	}
}
```
```csharp:Program.cs
namespace ModelViewer {
	static class Program {
		static void Main() {
			using(var core = new Core()) {
				core.Run();
			}
		}
	}
}
```
ここまでで、ウィンドウに描画したもの表示する準備ができました。描画の処理を一切行っていないため、プログラムを実行してもウィンドウが表示されるだけです。

###DirectXデバイスの初期化
次に、DirectXで3DCGの処理・表示を行うためにデバイスの初期化を行います。
また、背景色を設定し、DirectXが動いているか確認をします。

1. CreateWithSwapChain()を使用して、3DCGの処理を行うデバイスと、ウィンドウに画像を表示するためのスワップチェーンを生成します。
2. 描画対象を表すRenderTargetViewを生成し、青一色で初期化する。
Core.csを以下のように書き換えます。

```csharp:Core.cs
using SlimDX;
using SlimDX.Windows;
using System.Windows.Forms;
using Dx11 = SlimDX.Direct3D11;
using Dxgi = SlimDX.DXGI;

namespace ModelViewer {
	class Core : Form {
		private Dx11.Device device;
		private Dxgi.SwapChain swapChain;
		private Dx11.RenderTargetView renderTarget;

		public void Run() {
			InitializeDevice();
			MessagePump.Run(this, Draw);
			DisposeDevice();
		}

		protected virtual void Draw() {
			device.ImmediateContext.ClearRenderTargetView(renderTarget, new Color4(1, 0, 0, 1));

			swapChain.Present(0, Dxgi.PresentFlags.None);
		}

		private void InitializeDevice() {
			Dx11.Device.CreateWithSwapChain(
				Dx11.DriverType.Hardware, Dx11.DeviceCreationFlags.None,
				new Dxgi.SwapChainDescription() {
					BufferCount = 1, OutputHandle = this.Handle,
					IsWindowed = true,
					SampleDescription = new Dxgi.SampleDescription() {
						Count = 1, Quality = 0,
					}, ModeDescription = new Dxgi.ModeDescription() {
						Width = ClientSize.Width, Height = ClientSize.Height,
						RefreshRate = new Rational(60, 1),
						Format = Dxgi.Format.R8G8B8A8_UNorm
					}, Usage = Dxgi.Usage.RenderTargetOutput
				}, out device, out swapChain
			);

			InitializeRenderTarget();
		}

		private void InitializeRenderTarget() {
			using(var backBuffer = Dx11.Resource.FromSwapChain<Dx11.Texture2D>(swapChain, 0)) {
				renderTarget = new Dx11.RenderTargetView(device, backBuffer);
			}
		}

		private void DisposeDevice() {
			renderTarget.Dispose();
			device.Dispose();
			swapChain.Dispose();
		}
	}
}

```

細かいことは[こちら](http://memeplex.blog.shinobi.jp/directx11/c-%E3%81%A7directx11%20slimdx%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%9D%E3%81%AE02%20%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96)と[こちら](http://memeplex.blog.shinobi.jp/directx11/c-%E3%81%A7directx11%20slimdx%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%9D%E3%81%AE03%20%E8%83%8C%E6%99%AF%E3%81%AE%E3%82%AF%E3%83%AA%E3%82%A2)を参照してください。
上手くいけば、下の画像のようになります。
![blueonly.png](https://qiita-image-store.s3.amazonaws.com/0/135830/8e021b25-3b06-39c2-77fa-e162d66f1adc.png)

##おわりに
次回は、3DCGの基本である三角形の表示を行います。
次々回は、読み込んだPMDファイルのデータを用いて、頂点だけでモデルの表示を行う予定です。