こんにちは、エンジニアのオオバです。
SlimeDXを始めてみましたが、前回記事で空のウィンドウを出してみて、既にGPUを使っていると思っていましたが、そうではなく、GPUを使うためにはいろいろと設定が必要だったようで、その備忘録となります。
C#でDirectX11 SlimDXでウィンドウを表示させる - 渋谷ほととぎす通信
GPUを使用するためにはSlimDX.Direct3D11.Deviceクラス
を使用する必要があるようです。
DeviceクラスのファクトリメソッドCreateWithSwapChainを使います。
これを使うことで、DeviceとSwapChainが返却されます。
DeviceはGPUのことで、SwapChainはGPUが描画したものをおウィンドウに表示する機能とのことです。
プログラムをする上ではどちらも必要になります。
public static Result CreateWithSwapChain(
DriverType driverType,
DeviceCreationFlags flags,
SwapChainDescription swapChainDescription,
out Device device,
out SwapChain swapChain
);
CreateWithSwapChainメソッドには以下3つの情報が必要になります。
- DeviceType
- DeviceCreationFlags
- SwapChainDescription
返り値としてSlimDX.Result構造体が返却されますが、こちらは成功したか失敗したかなどの結果を返し、必要とはなるDeviceとSwapChainは第4第5引数に代入します。
いろいろ設定しないといけなそうですが、3D通常使用においてはほぼ一択で、以下のようになります。
デバイスとSwapChainを作成のみの部分コード · GitHub
この流れで、背景を単色で塗りつぶしさせてみます。
DeviceContext.ClearRenderTargetViewメソッドを使用します。
引数にRenderTargetViewとColor4を渡します。
DeviceContext
Deviceには描画するAPIが存在しません。代わりにDeviceContextクラスにそのあたりのメソッドが用意されているようです。しかし、単体で使うわけではなくdevice.ImmediateContext
プロパティを通じて使用することになります。
ということで、先の背景を赤一色で描画するときはこうなります
device.ImmediateContext.ClearRenderTargetView(view, new Color4(1,1,0,0));
※注意: Color4の引数は、ARGBの順番です。Unity感覚でいるとミスります
RenderTargetViewクラス
描画対象を表すクラスで、コンストラクタで生成してやるタイプのクラスです。
var renderTarget = new RenderTargetView(device, resource);
deviceは今まで出てきたDeviceインスタンスです。
resourceは描画対象を関連付けるリソースとのことです。具体的にはSwapChainのバックバッファーを指定します。
Texture2D backBuffer = Resource.FromSwapChain(swapChain, index)
ResourceクラスのファクトリーメソッドでSwapChainのバックバッファを取得します。第2引数のindexは通常0です。
クリアの反映
背景クリアの反映はSwapChain.Presentメソッドを呼ぶ必要があります。
swapChain.Present(0, PresentFlags.None);
最終的なコードはこちら
背景クリアショートコード · GitHub
実行するとこのように真っ赤な背景のウィンドウが描画されます。
以上
→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら
リスペクト
この記事が気に入ったらフォローしよう
- Windows8.1
- SlimDX 2.0.13.43