【发布时间】: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()。可能会针对最小的状态变化优化此排序过程,但这取决于您的场景。