忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

[Windows® API Code Pack for Microsoft® .NET Framework] C#でDirectX11をつかう その2 背景のクリア

前回作った雛形にコードを追加していきます。 

今回はDirect3Dのデバイスを作成して
ウィンドウの背景をクリアします。


using Microsoft.WindowsAPICodePack.DirectX.Direct3D11;
using Microsoft.WindowsAPICodePack.DirectX.Graphics;

class Program
{
    static void Main()
    {
        using (Game game = new Game())
        {
            game.Run();
        }
    }
}

class Game : System.Windows.Forms.Form
{
    SwapChain swapChain;
    DeviceContext deviceContext;
    RenderTargetView renderTargetView;

    public void Run()
    {
        initDevice();
        Show();

        while (Created)
        {
            Draw();
            System.Windows.Forms.Application.DoEvents();
        }
    }

    private void Draw()
    {
        deviceContext.ClearRenderTargetView(renderTargetView, new ColorRgba(0, 0, 1, 1));
        swapChain.Present(0, PresentOptions.None);
    }

    private void initDevice()
    {
        D3DDevice device = D3DDevice.CreateDeviceAndSwapChain(this.Handle);
        this.swapChain = device.SwapChain;
        this.deviceContext = device.ImmediateContext;

        using (Texture2D texture2D = swapChain.GetBuffer<Texture2D>(0))
        {
            this.renderTargetView = device.CreateRenderTargetView(texture2D);
            this.deviceContext.OM.RenderTargets = new OutputMergerRenderTargets(new[] { renderTargetView });
        }
    }
}
 これは背景を青でクリアしています。

directX11TutorialClearRenderTarget.jpg

最初にDirect3Dに関連したオブジェクトを初期化し
それを使ってwhileループの中で
延々と背景を青にクリアし続けています。

大まかに説明すると
こうなります:
クラス名 説明 XNAで言うと
SwapChain
 
 
 
これはダブルバッファリングを行うための2つのバッファを持っています。
 
(片方が描画対象、もう片方はディスプレイに表示されるバッファ)
 
この2つのバッファは、描画が終わって実際にディスプレイに表示するときに
 
役割が交代(スワップ)します
GraphicsDeviceがこれの機能を持っています
DeviceContext
描画を行うオブジェクトです。
これを使ってポリゴンとかいろいろなものを描画します。
GraphicsDeviceがこれに近いです。
RenderTargetView 描画する対象です。 RenderTarget2Dでしょうか

これら3つのオブジェクトを手に入れるためにD3DDeviceをつくっています。
SwapChainとIntermediateContextプロパティを通じて2つのオブジェクトを手に入れています。

「プロパティがあるんだからわざわざ2つもメンバ変数にしなくていいじゃない?
必要に応じてプロパティにアクセスすればメンバ変数は一つ減らせるし」
、と思われるかもしれません。

が、Windows API Code Packのソースを読めばわかりますが、
実はこのプロパティは内部で新たに生成して返しています。
今後実装が変わる可能性もありますが、ここでは念のためメンバ変数として確保しておきます。


エラーが起きる場合

64bit OSを使っている場合、
Windows API Code Packに含まれるx64のアセンブリを使いたくなるかもしれません。

しかしx86ではなくそっちを使うと、
BadImageFormatExceptionがスローされると思います。

しかしx86のアセンブリに切り替えて実行すると
今度はFileLoadExceptionがスローされるかもしれません。
にっちもさっちもいきません。
この原因は、アセンブリのランタイムバージョンが2.0だからです。

これはプロジェクトに.configファイルを次のように作れば解決します。
要はランタイムのバージョンが2.0であるアセンブリを使うことを示してやれば良いのです。

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>



 

拍手[1回]

PR