Альфа-маски ограничивают прозрачность столкновения / перезаписи с другими альфа-масками. XNA - PullRequest
0 голосов
/ 17 сентября 2018

Transparency overwriting

Выше приведен пример моей проблемы. У меня есть две одинаковые альфа-маски, просто белый градиент с прозрачным фоном.

Я рисую в RenderTexture2D, который отображается над экраном для создания освещения. Он очищает полупрозрачный черный цвет, а затем альфа-маски рисуются в правильном положении, чтобы выглядеть как огни ..

Сам по себе он работает нормально, но если два столкновения, как нижеприведенный «факел» против синих светящихся грибов, вы можете увидеть, что прозрачность ограничивающей рамки перезаписывает уже нарисованное оранжевое свечение.

Вот мой подход:

Это создает цель рендеринга:

RenderTarget2D = new RenderTarget2D(Global.GraphicsDevice, Global.Resolution.X+4, Global.Resolution.Y+4);
SpriteBatch = new SpriteBatch(Global.GraphicsDevice);

Это рисунок для цели рендеринга:

private void UpdateRenderTarget()
    {
        Global.GraphicsDevice.SetRenderTarget(RenderTarget2D);
        Global.GraphicsDevice.Clear(ClearColor);

        // Draw textures
        float i = 0;
        foreach (DrawableTexture item in DrawableTextures)
        {
            i += 0.1f;
            item.Update?.Invoke(item);

            SpriteBatch.Begin(SpriteSortMode.Immediate, item.Blend,
           SamplerState.PointClamp, DepthStencilState.Default,
           RasterizerState.CullNone);

            SpriteBatch.Draw(
                item.Texture,
                (item.Position - Position) + (item.Texture.Size() / 2 * (1 - item.Scale)),
                null,
                item.Color,
                0,
                Vector2.Zero,
                item.Scale,
                SpriteEffects.None,
                i
            );
            SpriteBatch.End();
        }

        Global.GraphicsDevice.SetRenderTarget(null);
    }

Я слышал о трафаретах глубины и т. Д. И мне кажется, что я пробовал так много комбинаций вещей, но я все еще понимаю проблему. У меня не было никаких проблем с этим при построении всей другой графики в моей игре.

Любая помощь очень ценится, спасибо! :)

1 Ответ

0 голосов
/ 18 сентября 2018

Ах, это оказалось проблемой с самим BlendState, а не с SpriteBatch. Я создал пользовательский BlendState «Multiply», который я нашел в Интернете и вызвал проблему.

"что вызвало" проблему - вот настоящий вопрос.

Это было решение для получения моего эффекта без "перекрытия":

public static BlendState Lighting = new BlendState
{
        ColorSourceBlend = Blend.One,
        ColorDestinationBlend = Blend.One,
        AlphaSourceBlend = Blend.Zero,
        AlphaDestinationBlend = Blend.InverseSourceColor
};

Это позволяет текстурам перекрываться, а также "вычитать" из слоя "тьмы". Было бы легче увидеть, если бы тьма была более непрозрачной.

Я ответил на это только в том случае, если произошли некоторые другие ошибки, связанные с состоянием смешения, с самим пакетом спрайтов.

...