我正在为 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允许我这样做之后关闭它)
答案 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并在之后重置它。我应该花更多时间查看我的代码。不过,谢谢你们的帮助!