XNA MonoGame, проблемы с рендерингом с помощью Bloom

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

    protected override void Draw(GameTime gameTime)
    {


        batch.Begin(SpriteSortMode.Texture, BlendState.Additive);
        bloom.BeginDraw();

        stateManager.Draw(gameTime, batch);

        batch.End();

        base.Draw(gameTime);
    }

Это работало нормально, но, конечно, выглядело ужасно, поэтому, чтобы разделить все это на два вызова отрисовки, один с блумом, а другой без него, я попробовал следующее:

    protected override void Draw(GameTime gameTime)
    {
        bloom.BeginDraw();
        GraphicsDevice.Clear(Color.Black);

        batch.Begin(SpriteSortMode.Texture, BlendState.Additive);

        stateManager.DrawBloomed(gameTime, batch);

        batch.End();

        base.Draw(gameTime);

        batch.Begin(SpriteSortMode.Deferred, BlendState.Additive);

        stateManager.Draw(gameTime, batch);

        batch.End();

        base.Draw(gameTime);

    }

Однако теперь все совершенно черное. Может ли кто-нибудь указать мне правильное направление относительно того, почему это происходит и как я «действительно» должен подходить к этой проблеме?


person Istarnion    schedule 06.01.2015    source источник


Ответы (1)


Ваш государственный менеджер звонит GraphicsDevice.Clear()? Если это так, то он очищает экран каждый раз и таким образом избавляется от всего вашего предыдущего рендеринга.

Вы должны вызывать base.Draw() только один раз за вызов, поэтому удалите тот, который находится посередине. Если base.Draw() очищает экран, это тоже будет причиной проблемы, поэтому либо удалите вызов, либо поместите его в начало метода.

Должна ли ваша вторая партия быть аддитивной? Я ожидал, что это будет альфа-смесь или непрозрачность.

Если ни один из вышеперечисленных способов не решит вашу проблему, опубликуйте код в stateManager.Draw(), код в stateManager.DrawBloomed(), код для вашего базового класса (если это не класс XNA) и снимок экрана с ожидаемым результатом. .

person Steve Lillis    schedule 06.01.2015
comment
Во-первых, нет, больше нигде в коде нет вызова GraphicsDevice.Clear(). Во-вторых, весь код, который я разместил, был из основного класса XNA по умолчанию, который расширяет xna.Framework.Game. StateManager.Draw() просто смотрит на текущее состояние и вызывает там метод Draw, передавая параметры. Оттуда это просто пакет.Draw(Texture2D, ...) Я ссылался на этот учебник при реализации этого: [Учебник Tuts+ XNA][1] Спасибо за ваш ответ! - person Istarnion; 06.01.2015
comment
А насчет режима наложения вы абсолютно правы. Это может быть AlphaBlend для лазеров или Opaque или AlphaBlend для других спрайтов. Я уже отчаялся и перепробовал все комбинации... - person Istarnion; 06.01.2015
comment
Ошибся со ссылкой выше, вот она: gamedevelopment.tutsplus.com/tutorials/ - person Istarnion; 06.01.2015
comment
Вы получаете рендеринг, когда удаляете bloom.BeginDraw()? Если это так, ваша проблема заключается в том, что bloom.BeginDraw() устанавливает значения, которые вы не сбрасываете, прежде чем выполнять остальную часть вашего смешивания. По крайней мере, когда я работал с XNA, я столкнулся с этой проблемой. - person Steve Lillis; 07.01.2015
comment
Кроме того, согласно статье, на которую вы ссылаетесь, все рисование, не связанное с цветением, должно происходить после вызова base.Draw(), поэтому удалите второй вызов. В конечном счете, лучше всего понять, как использовать шейдер непосредственно в XNA, и написать собственную реализацию. Вы обнаружите, что это проще, чем подгонять этот код цветения к вашим потребностям, что, вероятно, в конечном итоге потребует цели рендеринга и тому подобного для достижения желаемого конечного результата. - person Steve Lillis; 07.01.2015
comment
Я думаю ты прав. Я пытался удалить вызов Draw(), но безрезультатно. Сейчас я изучу RenderTargets и шейдеры, хотя надеюсь, что смогу хотя бы продолжать использовать данные шейдеры. Они кажутся довольно гибкими. Спасибо за вашу помощь! Я бы проголосовал за ваш ответ, но мне нужно немного больше представителей, извините. - person Istarnion; 07.01.2015