カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2012年10月28日(日)

XNA 4.0 の BlendState.NonPremultiplied の不具合

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

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

(過去ログ:XNA 4.0 の SpriteBatch で新しく導入された BlendState クラス)
と重複しますが、たぶん、これに引っかる人は
多いと思うので、もう 1 回書きます。

XNA 4.0 では、アルファ値が色情報に掛けられていない
Texture2D を描画するには、BlendState.NonPremultiplied
を使います。

ところが、BlendState.NonPremultiplied には不具合があります。
仕様どうり動くので、厳密には不具合では無いかもしれませんが、
設計ミスか、少なくとも注釈、注意が必要な仕様です。

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 フォトフレーム
試用は無料なので、是非使ってみてくださいね。


コメント
コメントする