Альфа-смешение в XNA - что я делаю не так? - PullRequest
1 голос
/ 07 апреля 2011

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

Снимок экрана на i.imgur.com / V4yK6.jpg - это то, что я получил в своих попытках работать с ответами других спрашивающих, используя тот же код шейдера, чтобы получить аналогичный эффект. в XNA 4.0. Очевидно, что я делаю что-то не так, потому что хочу, чтобы это выглядело так: i.imgur.com / ZgD3l.jpg . Может кто-нибудь взглянуть на мой код ниже и дать мне несколько подсказок о том, что я могу делать неправильно? Это вызывается после отрисовки фона:

            Rectangle originRect = glowingObject.BoundingRectangle;

            // Draw glow overlay
            int glowSideLength = SideLength;
            Rectangle glowRect = new Rectangle(originRect.X - ((glowSideLength - originRect.Width) / 2),
                originRect.Y - ((glowSideLength - originRect.Height) / 2), glowSideLength, glowSideLength);

            RenderTarget2D renderTarget = new RenderTarget2D(spriteBatch.GraphicsDevice,
                800, 600, false, SurfaceFormat.Color, DepthFormat.None, 4, RenderTargetUsage.PreserveContents);

            spriteBatch.GraphicsDevice.SetRenderTarget(renderTarget);
            spriteBatch.GraphicsDevice.BlendState = BlendState.Additive;
            spriteBatch.GraphicsDevice.Clear(Color.Black);

            //Draw some lights and apply shader
            lightEffect.CurrentTechnique.Passes[0].Apply();
            spriteBatch.Draw(glowOverlay, glowRect, Color.White);

            spriteBatch.GraphicsDevice.SetRenderTarget(null);

            //Draw "light mask"
            foreach (Gem gem in level.gems)
                gem.Draw(gameTime, spriteBatch);

            spriteBatch.Draw(renderTarget, Vector2.Zero, Color.White);
            spriteBatch.GraphicsDevice.BlendState = BlendState.NonPremultiplied;

Текстура glow3, с которой я сейчас тестирую, это просто черная фигура на прозрачном фоне: i.imgur.com / 3t9gf.png .

(Примечание. Изначально я просто создал простую текстуру с черным фоном и прозрачным центром и нарисовал ее сверху, но теперь, когда мне нужно несколько объектов с областями свечения, которые могут перекрываться, этот подход больше не будет работать; поэтому Мне нужно выяснить альфа-смешение ...)

1 Ответ

0 голосов
/ 17 июня 2011

Вот несколько полезных ресурсов по созданию Fog of War, которые, похоже, и являются тем, к чему вы стремитесь.

https://gamedev.stackexchange.com/questions/13675/draw-real-time-fog-of-war-in-2d-game

http://jsedlak.org/2009/10/27/2d-fog-of-war/

Использование AlphaСмешивание также даст вам желаемый эффект.Вторая ссылка использует альфа-смешивание и ту же технику, которую вы пытаетесь применить.Тем не менее, пример кода для XNA 3.1, а не 4.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...