【问题标题】:Blend state in XNAXNA 中的混合状态
【发布时间】:2015-03-24 17:09:15
【问题描述】:


我很难弄清楚如何在 XNA 中做某事。 我有这样的事情:

public void Draw()
{
     spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
     DrawFirstObject();    // Depth = 0.5f
     spriteBatch.End();

     spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Additive);
     DrawSecondObject();    // Depth = 0.2f
     spriteBatch.End();
}

基本上我需要 2 个不同的 spritebatch 开始调用,一个使用 AlphaBlend,一个使用 Additive BlendState。但问题是当我这样做时,第二次调用中的绘制对象总是绘制在第一个调用的顶部,而不是它们需要在它们后面的位置。我无法重新格式化我的代码,所以第二次调用在顶部,我需要保持深度顺序。因此,如果您有任何建议,我将不胜感激。

【问题讨论】:

  • 为什么不能重新订购代码?如果要进行 alpha 混合,则必须先绘制透明对象后面的对象。没有(简单的)方法可以解决这个问题。
  • 我无法重新排序我的代码,因为例如我有一个 tilemap 对象,它绘制需要使用 alpha 混合的图块,并且我在不同深度绘制图块,我调用 Draw with添加并绘制一些粒子。这些粒子必须在某些图块上方和其他图块之后,但它们被绘制在所有内容之上。
  • 那么你基本上需要对你的瓦片和粒子进行深度排序,并在遇到状态变化时动态发出spriteBatch.Begin()。可能会针对最小的状态变化优化此排序过程,但这取决于您的场景。

标签: c# xna


【解决方案1】:

由于您在第一次 Draw 调用中使用透明图像,因此理想情况下您应该使用 SpriteSortMode.BackToFront

SpriteSortMode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多