フルシーンアンチエイリアス

いまさらながらに、シーンエディタにFSAA(フルシーンアンチエイリアス)をつけていました。Managed DirectXでFSAAを掛けるには

param.SwapEffect = SwapEffect.Discard;
if (Manager.CheckDeviceMultiSampleType((int)Manager.Adapters.Default.Adapter, DeviceType.Hardware,
                    Format.X8R8G8B8, true, MultiSampleType.FourSamples, out ret, out qual))
{
   param.MultiSample = MultiSampleType.FourSamples;
      param.MultiSampleQuality = qual - 1;
}

とパラメータを指定してデバイスをつくり、

device.RenderState.MultiSampleAntiAlias = true;

以上で、アンチエイリアスが有効になります。簡単ですね。
で、何で今までFSAAを放置していたかというと、なんか上手くいかなかったからです。MultiSampleを指定するとDirectXバイスの生成に失敗します。原因を調べるのが面倒だったので、放置していたというわけです。
しかし、とあるデモ時にFSAAを掛ける必要がでたため、本腰を入れて調査しました。
結果から言うと、犯人は以下のパラメータ設定でした。

param.PresentFlag = PresentFlag.LockableBackBuffer;

どうも、こいつがいるとダメらしい。MultiSampleの機構を考えると当たり前ですね。
というわけで、バックバッファに対するアンチエイリアスはこれでできました。


普通は、これで完了なのですが…シーンエディタはそんなに甘くなかった。。。
シーンエディタには、2Dフィルタという機構があります。2Dフィルタは、内部的には一旦テクスチャに画像をレンダリングし、それを今度はテクスチャとして利用してシェーダーを通して表示する絵を作っています。(マルチターゲットレンダリングと呼ぶんでしたっけ?)
つまり、シーンエディタでアンチエイリアスを掛ける対象は、バックバッファではなく、このフィルタ用のテクスチャなわけです。しかしながら、MultiSampleのテクスチャを作るメソッドが見当たらない…
仕方ないので、今のところはMultiSampleのサーフェイスを生成し、そこにレンダリングした後テクスチャにその画像を転送して…という手順を取ることにしました。ん〜、パフォーマンスが結構落ちます。。。
この問題に関して、何か情報をお持ちの方がいれば、教えてやってくださいm(_ _)m
FSAA、結構大変です。

[ちょっとメモ書き]
レンダリング対象のサーフェイスと深度バッファのMultiSampleTypeは同じにしないとだめ。(これも当たり前か。)