XNA Game Studio 4.0の乗算済みアルファ機能

3D対応のグラフィクスカードが登場してから、グラフィクス・プログラマー、というより、デザイナーさんの長年の悩みのひとつとして、スプライトなどの画像のエッジに意図しない色がでてしまうという、色のにじみ問題があります。

この問題に直面したデザイナーさんの多くはグラフィクス・プログラマーに相談しますが、

「バイリニア・フィルタのせいだね、絵の方を変えるようにしてね」

と、言われることが多いと思います(私も昔はそう返答してました)。デザイナーさんの中にはカラー部分とアルファチャンネル部分を分けて時間を掛けて修正したり、エッジ部分を処理するツールを使ったりしていました。ですが、プログラマーに絵を渡す前にいちいちツールを通す手間があり、こういったツールはエッジ部分を見つけて処理するという画像処理をするので、処理に時間が掛かり、ゲーム実行時に使うには向いていない手法です。ですから、レンダーターゲットを使ってリアルタイムにスプライト画像を作って使うというケースでは使えません。また、画像のを表示座標を整数値にクランプしたり、中にはバイリニア・フィルタリングを切ってしまうなどの、せっかくのバイリニア・フィルタリングの効果を消してしまっている人達もいます。

ゲーム製作初心者の多くがこの問題に直面し、フォーラムなどには定期的に同じ質問があがりますが、大抵は前述のプログラマーのような返答をもらうことが多いです。

実はこの問題の原因はバイリニア・フィルタリングのみの問題ではなく、バイリニア・フィルタリングとアルファ・ブレンディングを併用したときに起こる現象なのですが、この原因と、対処方法を簡潔に説明するのは簡単ではありません。バイリニア・フィルタリングとアルファ・ブレンディングの両方の仕組みを理解する必要があります。仕事でゲームを作っているのであれば時間を掛けて理解するのも仕事のうちなので、勉強会を開いたりして(勉強中も会社がお金払ってくれるしね)、説明することもできますが、趣味でゲームを作っている人達にこういった説明をし、更に修正してもらうというのは現実的ではありません。

乗算済みアルファで解決

2008年の8月、XNAフォーラムへの投稿があったときに、私とShawnはこの問題について話をし、その結果、解決策として乗算済みアルファ(Pre-Multiplied Alpha)を使うということになりました。おそらく聞きなれない言葉だと思いますが、海外でもゲーム開発者の間ではあまり知られていない言葉で「Premultiplied Alpha Game」で検索するとヒット数は5,000件足らず、トップはShawnのサイトで、日本に至っては「Premultiplied Alpha ゲーム」で検索すると165件で、トップは前述のフォーラムの投稿になっています。これは、現在(2010年6月)の時点での状況で、2008年当時はさらにヒット数が少なかったと記憶しています。

注:Pre-Multiplied Alphaの日本語訳が見つからなかったので、ここでは「乗算済みアルファ」という日本語に訳しています

この問題の特徴として

  1. 初心者をはじめ、殆どの人が同じ問題を経験している
  2. 解決策はあるが、プログラムとコンテントの両方を変えないといけない
  3. 解決策自体があまり知られていないので、ググもとい、Bingで検索して自力(特に初心者)で解決するのが難しい

今までのゲームライブラリの多くはプログラム部分に特化しているものが多く、2番目のコンテント自体の変更をコントロールできなかったのが解決策を採用できなかった、できてもコンテントまでは面倒見てくれないので実際に使われることが少なかったのではないでしょうか?

幸い、XNAにはコンテント・パイプラインが標準でついているので乗算済みアルファを実現できる!

と、Shawnと私で盛り上がったのですが、時期的に3.0の出荷時期だったので実現することができませんでした。そして、3.1の時にはマイナーバージョンアップということで採用が見送られました。

そして、Windows Phoneという新しいプラットフォームへの対応をするために大規模な変更をする必要があったXNA Game Studio 4.0で、ついに実現することができました。

乗算済みアルファをXNA Game Studio 4.0で使う

まずは、乗算済みアルファの効果の程を動画で見てください。判りやすくする為に拡大画面もありますが、720pの動画だと実物大でも差があるということがわかるので、HD動画をフルスクリーンにして見ることを勧めします。

では、どうやって乗算済みアルファをXNA Game Studio 4.0で使うのでしょうか?

 

答え: なにもしなくて良い (ただし、4.0以前からの移行には多少の変更が必要)

 

XNA Game Studio 4.0では乗算済みアルファが既定となっています。スプライト用の画像をコンテントとしてプロジェクトに追加し、普通にSpriteBatchで描画するだけで乗算済みアルファを使う、つまり今まで悩みのタネだった色のにじみも、手作業で修正する必要も、ツールで処理する必要もなくなったということです。

次回は、乗算済みアルファ設定とプログラム内での使い方の仕方を紹介します。

つづく…