ひにけにXNAさんのブログの3/8更新分
でTCRについて触れていて非常に興味深い内容として
読んだのですがその中にMSAAに関する記事があり
そういえばこれまでMSAAとか無視してたけど
確かにGPUのパワーに余裕がありそうなXBOX360では
MSAAを有効にするのはいいなと思ったのもあって
サンプルコードを組み込んでみました。
そうすると、PC環境で例外が…
サンプルコードの丸写しで画質が良くなる
と甘いことを考えていたのですが世の中それほど甘くはありませんでした。
ということで原因を追ったのですが
サンプルコード中のPresentationParametersの設定が
pp.MultiSampleQuality = 1;
pp.MultiSampleType = mst;
となっていてこの部分がどうやら怪しそうだということがわかりました
具体的にどうなおしたか?というと
pp.MultiSampleQuality = quality – 1;
という風に書き換えました。
なぜにquaity – 1なのか?という部分ですが
CheckDeviceMultiSampleTypeを呼び出すことによって
qualityには使用可能なクオリティレベルの数が入るそうです
(DirectX9のAPIリファレンスによる)
ここで勘違いしやすいのですが使用可能な数なので
qualityの値が1だったとすると使用可能な数が1つ。
0から数えるとすると0のみ指定可能ということになります。
そのほかにもXBOX360環境でもこの値を1固定に設定してしまっているのですが
この設定が本当に1固定にしてしまって良いのか?というとちょっと気になるところです。
XBOX360環境であっても今後、次世代機などが出てきたときに変わったりすることを考えると
ハードウェアから情報を拾ってそれを使った方があとあと嬉しいことになる気がしています。
そういうところでサンプルからどのように変更したのか?
コールバック関数の全文をここに載せておきたいと思います。
同じようなはまり方をしている人は役に立ててもらえると
(と、書いておきながらXBOX360実機上での動作テストはまだやっていません。
PC環境ではRADEON X1300とGeForce Go6400で動作確認済みです)
private void PreparingDeviceSettings(
object sender,
PreparingDeviceSettingsEventArgs e)
{
PresentationParameters pp = e.GraphicsDeviceInformation.PresentationParameters;
GraphicsAdapter adapter = e.GraphicsDeviceInformation.Adapter;
SurfaceFormat format = adapter.CurrentDisplayMode.Format;
int qualityLevels = 0;
bool checkDevice = false;
#if (XBOX360)
qualityLevels = 0;
adapter.CheckDeviceMultiSampleType(
DeviceType.Hardware,
format,
false,
MultiSampleType.FourSamples,
out qualityLevels);
pp.MultiSampleType = MultiSampleType.FourSamples;
pp.MultiSampleQuality = qualityLevels – 1;
#else
//MSAAを有効にする場合はtrueに変更する
#if true
MultiSampleType[] multiSampleTypes =
{
MultiSampleType.FourSamples,
MultiSampleType.TwoSamples,
};
foreach (MultiSampleType multiSampleType in multiSampleTypes) {
qualityLevels = 0;
#if (DEBUG)
checkDevice = adapter.CheckDeviceMultiSampleType(
DeviceType.Hardware,
format,
false,
multiSampleType,
out qualityLevels);
#else
checkDevice = adapter.CheckDeviceMultiSampleType(
DeviceType.Hardware,
SurfaceFormat.Bgr32,
true,
multiSampleType,
out qualityLevels);
#endif
if (checkDevice == true) {
pp.MultiSampleType = multiSampleType;
pp.MultiSampleQuality = qualityLevels – 1;
break;
}
}
#endif
#endif
}