0

私はいくつかのブレンド モードを使用する必要があるTerraria ( C#で記述され、 XNAを使用) 用の何らかの mod に取り組んでいます。加算ブレンディングを機能させるのに問題はありませんでしたが、減算ブレンディングはいくつかの問題を引き起こします。
減算ブレンディングで何とか表示できたのですが、どうしても標準モードに戻したくありません。SpriteBatch.EndBeginはまったく役に立ちません。

これは私のカスタムBlendStateです:

public readonly static BlendState
    bsSubtract = new BlendState{
        ColorSourceBlend = Blend.SourceAlpha,
        ColorDestinationBlend = Blend.One,
        ColorBlendFunction = BlendFunction.ReverseSubtract,
        AlphaSourceBlend = Blend.SourceAlpha,
        AlphaDestinationBlend = Blend.One,
        AlphaBlendFunction = BlendFunction.ReverseSubtract
    },

描画コード:

sb.End();
sb.Begin(SpriteSortMode.Immediate,bsSubtract);
(...drawing drawing blah...)
sb.End();
sb.Begin(SpriteSortMode.Immediate,BlendState.Additive);

問題は、このコードの後に​​描画されるものはすべて、まだいくつかの古いオプション (半透明、当たり障りのないもの) を使用しているように見えることです。私は何を間違っていますか?

ブレンド状態を元に戻す前に sb.End ()sb.Begin( )だけを呼び出してみたり、 BlendFunctionsをAddに設定しただけで、標準の加算的な状態である別のカスタム ブレンド状態を使用してみましたが、役に立ちませんでした。

編集:任意のカスタム BlendState を設定すると、それが可能になるようです...

EDIT2: 問題は、図面を 3 つの別々の場所に分割したことのようです。1 つはアイテム スロット用、もう 1 つはタイル用、もう 1 つは一般的な世界用です。そして、これらの(アイテム)の1つで、使用する前にSpriteBatchを設定し、後でリセットするのを忘れていましたコードを見るのにもっと時間を費やすべきでした。それでも、助けてくれてありがとう!
(まだ質問を閉じることはできません。StackOverflow で許可されたら閉じます)

4

2 に答える 2

0

デフォルトのブレンド モードは ですBlendState.AlphaBlend

コード内を に置き換えBlendState.Additiveてみてください。BlendState.AlphaBlendあるいはNonPremultiplied、Terraria が実際に使用しているものによって異なります。

さらに良いことに、Terraria が使用していたブレンド状態を正確SpriteBatchに読み取ることができ、それをグラフィックス カードに設定してそのままにしておくことができます。まさにそれを行うはずのテストされていないコードを次に示します。

sb.End(); // Sets blend state
BlendState previousState = GraphicsDevice.BlendState; // Retrieve it
sb.Begin(SpriteSortMode.Immediate, bsSubtract);
// (...drawing drawing blah...)
sb.End();
sb.Begin(SpriteSortMode.Immediate, previousState); // Re-use it
于 2013-06-17T13:18:28.793 に答える
0

問題は、図面を 3 つの別々の場所に分割したことのようです。1 つはアイテム スロット用、もう 1 つはタイル用、もう 1 つは一般的な世界用です。そして、これらの(アイテム)の1つで、使用する前にSpriteBatchを設定し、後でリセットするのを忘れていましたコードを見るのにもっと時間を費やすべきでした。それでも、助けてくれてありがとう!

于 2013-06-19T08:27:45.017 に答える