渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

C#でDirectX11 SlimDXでGPUを使用して描画する


SlimeDXを始めてみましたが、前回記事で空のウィンドウを出してみて、既にGPUを使っていると思っていましたが、そうではなく、GPUを使うためにはいろいろと設定が必要だったようで、その備忘録となります。

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通常使用においてはほぼ一択で、以下のようになります。

この流れで、背景を単色で塗りつぶしさせてみます。

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<Texture2D>(swapChain, index)

ResourceクラスのファクトリーメソッドでSwapChainのバックバッファを取得します。第2引数のindexは通常0です。

クリアの反映

背景クリアの反映はSwapChain.Presentメソッドを呼ぶ必要があります。

swapChain.Present(0, PresentFlags.None);

最終的なコードはこちら

f:id:esakun:20181114113629p:plain
実行するとこのように真っ赤な背景のウィンドウが描画されます。


以上

環境

  • Windows8.1
  • SlimDX 2.0.13.43

リスペクト