カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2012年10月28日(日)

XNA 4.0 の SpriteBatch で新しく導入された BlendState クラス

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、XNA 4.0 の BlendState クラスについてです。

XNA 4.0 では、SpriteBatch.Begin の引数から、SpriteBlendMode
が無くなり、かわりに、BlendState が導入されています。

なんとなく、SpriteBlendMode.AlphaBlend に対応するのは、
BlendState.AlphaBlend のような気がしますが、違います。

XNA 4.0 では、3.1 と異なり、基本的に、
アルファ値が色情報にかけられたものを色の基本単位としています。
BlendState.AlphaBlend は、アルファ値が色にかけられた
状態の Texture2D を描画するのに使います。

無理やり (XNA 4.0 の思想にさからって)、アルファ値が色情報に
掛けられていないものを描画するには、BlendState.NonPremultiplied
を指定します。

BlendState.NonPremultiplied を指定すれば、すべて解決かというと、
そうでもありません。1 つは、XNA 3.1 では、SpriteBatch.Draw で、
アルファ値を指定して画像を描く場合、Color(255, 255, 255, alpha)
を渡していいましたが、XNA 4.0 では、Color(alpha, alpha, alpha, alpha)
を渡す必要があります。

もう 1 つは、BlendState.NonPremultiplied が、

AlphaBlendFunction = BlendFunction.Add,
ColorBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.SourceAlpha,
AlphaSourceBlend = Blend.SourceAlpha,
ColorDestinationBlend = Blend.InverseSourceAlpha,
AlphaDestinationBlend = Blend.InverseSourceAlpha,

と定義されているので、出力先のアルファ値が正しく計算されません。
正しくは、AlphaSourceBlend = Blend.One です。

描画先が画面の場合は、出力アルファ値は見た目に影響を与えないので、
問題ありませんが、RenderTarget2D に描画する場合、
描画先の Texture2D のアルファ値はおかしなものになります。
例えば、不透明な画像に透明な画像を描くと透明になったりします。

下のような BlendState を指定すれば、
出力アルファ値も正しくなりますが、Reach プロファイルでは
使えないみたいです。(HiDef プロファイルが必要)

public static readonly BlendState _NonPremultiplied = new BlendState()
{
	AlphaBlendFunction = BlendFunction.Add,
	ColorBlendFunction = BlendFunction.Add,
	ColorSourceBlend = Blend.SourceAlpha,
	AlphaSourceBlend = Blend.One,
	ColorDestinationBlend = Blend.InverseSourceAlpha,
	AlphaDestinationBlend = Blend.InverseSourceAlpha,
};

HiDef プロファイルを使用するには、Shader Model 3.0
に対応したグラフィックカードが必要で、敷居が高そうです。

実際、父親の結構新しめの、ノート PC でも動きませんでした。

そこで、ミルノでは、出力アルファを無視することで、
BlendState.NonPremultiplied をうまく乗りこなすことにしています。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


コメント
コメントする