1

我能够在 XNA 3.1 中做到这一点,但是我看到我们现在在 XNA 4 中使用状态对象,这当然是一个改进,尽管到目前为止我还不能完成我想要的 :)

我在尝试着:

将模板缓冲区清除为 0。

将纹理绘制到模板缓冲区,将绘制纹理的模板缓冲区设置为 1。

绘制另一个仅出现在模板缓冲区不是 1 的地方的纹理。

这是我到目前为止所拥有的,这似乎对纹理 2 的绘制没有影响:

BlendState blend = new BlendState();
blend.ColorWriteChannels = ColorWriteChannels.None;


_preSparkStencil = new DepthStencilState();
_preSparkStencil.StencilEnable = true;
_preSparkStencil.StencilFunction = CompareFunction.Always;
_preSparkStencil.ReferenceStencil = 1;
_preSparkStencil.DepthBufferEnable = true;

_sparkStencil = new DepthStencilState();
_sparkStencil.StencilEnable = true;
_sparkStencil.StencilFunction = CompareFunction.NotEqual;
_sparkStencil.ReferenceStencil = 1;
_sparkStencil.DepthBufferEnable = true;

gd.DepthStencilState = _preSparkStencil;

gd.Clear(ClearOptions.Stencil, Color.Black, 0, 0);

sb.Begin(SpriteSortMode.Deferred, blend);

DrawTexture1();

sb.End();

gd.DepthStencilState = _sparkStencil;

sb.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied);
DrawTexture2();
sb.End();

gd.DepthStencilState = old;
4

1 回答 1

1

问题是需要将 RenderState 传递给 SpriteBatch,否则 SpriteBatch 将使用它自己的 RenderState。

    sb.Begin(SpriteSortMode.Deferred, BlendState.Opaque, 
        SamplerState.LinearWrap, _preSparkStencil, 
        RasterizerState.CullCounterClockwise, CLM.AlphaClip);
于 2011-02-20T15:41:09.713 回答