こんにちは、エンジニアのオオバです。

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つの情報が必要になります。

返り値として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

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

実行するとこのように真っ赤な背景のウィンドウが描画されます。

以上

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

リスペクト

オススメ記事
検証環境