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

XNA Game Studio 4.0では乗算済みアルファがデフォルト設定となっています。

  • BlendState.AlphaBlendは乗算済みアルファ・ブレンディングになっている
  • 引数なしのSpriteBatch.Begin()メソッドは、BlendState.AlphaBlend、つまり乗算済みアルファブレンディングを使用する
  • 今まで使っていたアルファ・ブレンディングを使いたい場合はBlendState.NonPremultipliedを指定する

コンテント・パイプラインではデフォルトで全てのテクスチャを乗算済みアルファ形式へと変換するようになりました。変換したくない、もしくは既に乗算済みアルファ形式に変換されている場合は”Premultiplied Alpha”プロセッサー・パラメーターにfalseを設定することで、乗算済みアルファ形式への変換をしないようにすることができます。

premultipliedalpha-processor-param

 

また、乗算済みアルファをサポートするためにColor構造体に幾つかの変更を加えました。

  • 乗算済みアルファを使っている場合には、混乱と元となるアルファ値を変更する為のColor(rgb, alpha)コンストラクタを削除
  • 乗算済みアルファを使っている場合に、透明度を変えるためのcolor * alpha演算子を追加
  • Color.FromNonPremultiplied変換ヘルパーメソッドを追加
  • Color.TransparentBlackとColor.TransparentWhiteの代わりにColor.Transparentを追加

BasicEffectとほかのビルトイン・エフェクトは乗算済みアルファを前提としているので、幾つかのケースでは注意する必要があります。

  • 不透明オブジェクトを描画している場合は、乗算済みも通常アルファも関係ない
  • 半透明オブジェクトを描画している場合はスペキュラ、フォグ、そして環境マッピングには乗算済みアルファである必要がある
  • それ以外はどちらのフォーマットでも問題なし

既存コードの乗算済みアルファへの対応

殆どのゲームでは、以下のコードのようにカラー構造体にアルファ値を指定している場所を変更するだけで済みます。

 new Color(color, alpha)   // alphaはバイト値(0-255)

と、なっている部分を、以下のコードの様に変更します。

 color * alpha   // alphaはfloat値(0-1)

面倒なのは変更自体は少なくとも、変更しないといけない箇所が複数に及ぶことです。ですが、元のコードが使っているコンストラクタ・オーバーロード自体が削除されているので、コンパイル時にエラーという形でコンパイラーが修正しないといけない箇所を知らせてくれます。

もし、テクスチャデータのアルファチャンネルに半透明以外の情報、例えばグロスマップ用の値などを格納している場合は、プロセッサー・パラメーターの「Premultiplied Alpha」のオプションにfalseを設定します。

 

乗算済みアルファを使いたくない場合

もし、Game Studio 4.0より前の形式のアルファ・ブレンディングを使いたい場合は以下の変更を加えます。

  • モデルやテクスチャプロセッサーの“Premultiplied Alpha”オプションにfalseを設定する
  • モデル描画時や、SpriteBatch.Begin呼び出し時に、BlendState.NonPremultipliedを指定する
  • new Color(color,alpha)となっている部分をnew Color(colorR, ColorG, colorB, alpha)に変更する

原文:

http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4-0.aspx