XNAと乗算済みアルファの関係について

XNA4.0での乗算済みアルファの扱いについて元XNAチームの@HigenekoさんとXNA利用者の会話
3
ひげねこ@猫 @Higeneko

@kouzirou SpriteBatchで使われているソートは安定ソートではないので、評価対象となる深度値が同じ場合、ソート対象の内容(要素数など)によって結果が変わってくるので、それが原因になっているのかもしれませんね。

2011-08-30 15:37:14
めんたろ @mentaro

乗算アルファにはまってた。罠すぎる

2011-08-30 16:53:41
めんたろ @mentaro

@nakfiv NonPremultipliedェ…って感じだった

2011-08-30 16:58:01
nakfiv a.k.a. noriP @nakfiv

@mentaro まさにその辺を帰宅後に色々と見る作業が待ってるのですw

2011-08-30 16:58:30
DARL @DARL_Japan

@nakfiv @mentaro 「BlendState.NonPremultiplied」で描画する時は、画像リソースのコンテンツプロセッサで、「乗算済みアルファ」をfalseにするとかね。割と面倒。

2011-08-30 17:11:43
nakfiv a.k.a. noriP @nakfiv

@DARL_Japan @mentaro これの何が嫌かってXNA特有の設定なので依存度が高くなるのですよね。理解していれば大きな問題では無いのですが…

2011-08-30 17:12:54
ひげねこ@猫 @Higeneko

@nakfiv @mentaro 乗算済みアルファはXNA特有機能じゃないですよ。コンポジッションの世界では四半世紀前から使われていてます~ http://t.co/U5CUFTB と、いうより、NonPremultipliedは光を扱う式としては間違っているんですよ

2011-08-30 17:30:18
nakfiv a.k.a. noriP @nakfiv

@Higeneko @mentaro その辺は解説を読んで理解はしていますが他のAPIに移す事を考慮した時にやはり考え方が異なるものなのでどちらかと言うと推奨する追加機能の扱いにして欲しかったです。間違いを正しつつ簡単にしようというXNAの思想はわかりますが

2011-08-30 17:35:26
ひげねこ@猫 @Higeneko

@nakfiv @mentaro 例えばどのAPIでしょう?OpenGL ならESを含めて乗算済みアルファのブレンドステートを使えますけど

2011-08-30 17:37:45
nakfiv a.k.a. noriP @nakfiv

@Higeneko @mentaro API的には再現できますがデータレベルで無加工では再現できませんよね?

2011-08-30 17:38:35
ひげねこ@猫 @Higeneko

@nakfiv @mentaro データ無加工でもシェーダーサポートしている環境なら1命令で実現可能ですよcolor.rgb *= color.aでできます。

2011-08-30 17:45:19
nakfiv a.k.a. noriP @nakfiv

@Higeneko @mentaro 固定レンダリングパイプラインの環境ではテクスチャ読み込み時にデータ加工をするなりツールで処理するなり必要ですよね?個人的にそういう事が必要という事自体あまり歓迎していないというだけです

2011-08-30 17:46:58
めんたろ @mentaro

@Higeneko @nakfiv @DARL_Japan 自分はちょうどbyte配列からテクスチャをSetDataで生成してたので、乗算アルファのことがすっぽり抜けてたんですよね。 今更な話ですけど3.1以前のつもりで使っていたらかなり悩みましたw

2011-08-30 17:47:09
nakfiv a.k.a. noriP @nakfiv

どっちにしても開発環境の思想が気に入らないなら使うなというだけなので変更があったらその変更に合わせて使うだけなのでそもそもが割と不毛な議論である感はあるw

2011-08-30 17:48:05
ひげねこ@猫 @Higeneko

@nakfiv @mentaro というか、NonPremultipliedにはなんの利点もないんですよ。バイリニア使うと滲むし、原因を知らないとアーティストさんに色がにじむから滲まないようにデータ修正する余計な労力を掛けたりするだけなんですよ

2011-08-30 17:48:59
めんたろ @mentaro

@Higeneko @nakfiv @DARL_Japan ちなみに作ってるのはツールなのでWin専用。 今回はContentPipelineは通して無いです。

2011-08-30 17:49:24
ひげねこ@猫 @Higeneko

@nakfiv @mentaro いやいや、思想うんぬんじゃなくて、単に今までゲームの世界で間違った式が習慣的に使われていたってだけの話です

2011-08-30 17:50:56
DARL @DARL_Japan

.NetのPixelFormatにも乗算済みのフォーマット揃ってるけど、使った事無いな。

2011-08-30 17:53:27
ひげねこ@猫 @Higeneko

@nakfiv @mentaro After Effectとか使っている人達にとっては当たり前のことで、XNA 4.0で乗算済みアルファが標準になって「やっとかよ」みたいな反応でしたし(汗)

2011-08-30 17:54:57
ひげねこ@猫 @Higeneko

実際に測ったことはありませんが、式も単純化されるのでGPUによっては乗算済みアルファの方が高速になるという話も聞きますね

2011-08-30 17:57:26
めんたろ @mentaro

@Higeneko @nakfiv 乗算済みアルファは良い機能だと思いますよ。 ただ個人的には BlendState.AlphaBlend の挙動は変えずに新しく用意してもらったほうが誤解は少ないかなと思いました。

2011-08-30 17:58:46
ひげねこ@猫 @Higeneko

@mentaro @nakfiv そこはチーム内でも話し合いになりましたね。やはり決め手となったのは、現行の式が間違いであり、それによって色が滲むという問題に直面した人に対して簡単に説明する手段がないし、気づいた時点でデータやプログラムを修正するのは難しい (続く)

2011-08-30 18:01:47
ひげねこ@猫 @Higeneko

@mentaro @nakfiv それだったら、4.0へ移行した時に、目に見える形で以前と違う結果として直ぐに修正する箇所がわかるようにしようという結論になりました。同様に4.0移行時に出るコンパイルエラーもわざとエラーになるようにAPI設計されています

2011-08-30 18:04:45
ひげねこ@猫 @Higeneko

@mentaro @nakfiv Shawnがブログでも言っている( http://t.co/F3ltJqB )ようにXNA GSE~3.1まではDX9ベースで設計されてきましたが、いずれはDX10/11に対応しなければいけない時が来るし、(続く)

2011-08-30 18:14:40