如何在C#,XNA中正确实现减色混合?

时间:2013-06-17 12:36:15

标签: c# xna blending subtraction

我正在为 Terraria (用 C#编写并使用 XNA )开发某种mod,我需要在其中使用一些混合模式。我没有任何麻烦让添加剂混合工作,但减去一个导致我一些问题 我设法用减法混合显示东西,但它并不真的想要返回标准模式。 SpriteBatch.End Begin 根本没有帮助。

这是我的自定义 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 设置为添加,但无济于事。

编辑:似乎设置任何自定义BlendState使它做到这一点...

EDIT2:似乎问题在于我将绘图拆分为3个不同的位置:一个用于项目位置,一个用于切片,一个用于一般的世界。在其中一个(项目)我忘了在使用之前设置SpriteBatch并在之后重置它。我应该花更多时间查看我的代码。不过,谢谢你们的帮助! (暂时不能关闭这个问题,在StackOverflow允许我这样做之后关闭它)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

似乎问题是我将绘图拆分为3个不同的位置:一个用于项目槽,一个用于瓷砖,一个用于世界。在其中一个(项目)我忘了在使用之前设置SpriteBatch并在之后重置它。我应该花更多时间查看我的代码。不过,谢谢你们的帮助!