Попытка понять трафареты (XNA 4.0, Windows Phone 7) - PullRequest
2 голосов
/ 25 апреля 2011

Я пытаюсь понять трафареты.Я мог бы использовать хороший учебник, объясняющий, как они работают, но в то же время вот с чем я работаю:

DepthStencilState _StencilAlways;
DepthStencilState _StencilKeepIfZero;

SpriteBatch _StencilBatch;
SpriteBatch _MaskBatch;

_StencilAlways = new DepthStencilState();
_StencilAlways.StencilEnable = true;
_StencilAlways.StencilFunction = CompareFunction.Always;
_StencilAlways.StencilPass = StencilOperation.Replace;
_StencilAlways.ReferenceStencil = 1;
_StencilAlways.DepthBufferEnable = false; 

_StencilKeepIfZero = new DepthStencilState();
_StencilKeepIfZero.StencilEnable = true;
_StencilKeepIfZero.StencilFunction = CompareFunction.Equal;
_StencilKeepIfZero.StencilPass = StencilOperation.Keep;
_StencilKeepIfZero.ReferenceStencil = 0;
_StencilKeepIfZero.DepthBufferEnable = false;

RenderTarget2D MaskRenderTarget = new RenderTarget2D(device, Width, Height, false, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, 0, RenderTargetUsage.DiscardContents);

GraphicsDevice.SetRenderTarget(MaskRenderTarget);
GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.Stencil, new Color(0, 0, 0, 1), 0, 0);

_MaskBatch.Begin(SpriteSortMode.Immediate, null, null, _StencilAlways, null);
_MaskBatch.Draw(
    Texture,
    Position,
    null,
    Shade,
    0,
    Vector2.Zero,
    Scale,
    SpriteEffects.None,
    0);
_MaskBatch.End();

_StencilBatch.Begin(SpriteSortMode.Immediate, null, null, _StencilKeepIfZero, null);
_StencilBatch.DrawString(
    _Font, 
    Line, 
    Position2, 
    Shade);
_StencilBatch.End();

_RenderedTexture = MaskRenderTarget;

GraphicsDevice.SetRenderTargets(null);

Могут быть некоторые ошибки транспонирования / санации, но любые идеи, которые я делаюнеправильно?

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Код см. В моем ответе на форумах App Hub: http://forums.create.msdn.com/forums/p/81189/499989.aspx#499989

Вы хотите, чтобы значение ReferenceStencil было равно 1 оба раза.

Вам также необходимо создать экземпляр AlphaTestEffect с AlphaFunction = CompareGreater, ReferenceAlpha = 0 и соответствующей матрицей проекции, созданной с помощью Matrix.OrthographicOffCenter (0, ширина, высота, 0, 0, 1); .

Затем нужно передать это в SpriteBatch.Begin как при рисовании трафарета, так и снова при рисовании трафарета, который вы хотите.

Кроме того, вы должны сначала нарисовать трафарет, а затем нарисовать то, что вы хотите, трафарет. В приведенном выше случае переместите DrawString туда, где находится Draw, и Draw в положение DrawString. Сначала он рисует трафарет (текст). Затем он рисует предмет (вашу текстуру) и сохраняет только те части предмета, на которых трафарет говорит, что должен.

И вы, вероятно, хотите использовать Color.Transparent вместо нового Color (0,0,0,1) для цвета Clear.

1 голос
/ 25 апреля 2011

Я бы рекомендовал поискать трафаретный буфер, который не связан с XNA / Windows Phone.В конце значения или использование полностью одинаковы.

Его основная функция, которую поддерживают все графические карты, и DirectX и OpenGL имеют привязки к.

http://en.wikipedia.org/wiki/Stencil_buffer или http://www.google.cz/search?q=stencil+buffer

...