Трафаретное тестирование в XNA 4 - PullRequest
1 голос
/ 20 февраля 2011

Мне удалось сделать это в 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;

1 Ответ

1 голос
/ 20 февраля 2011

Проблема заключалась в том, что RenderState нужно было передать в SpriteBatch, иначе SpriteBatch будет использовать свой собственный RenderState.

    sb.Begin(SpriteSortMode.Deferred, BlendState.Opaque, 
        SamplerState.LinearWrap, _preSparkStencil, 
        RasterizerState.CullCounterClockwise, CLM.AlphaClip);
...