フルシーンアンチエイリアス
いまさらながらに、シーンエディタに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は同じにしないとだめ。(これも当たり前か。)