在XNA中进行Alpha混合 - 我做错了什么?

时间:2011-04-07 02:46:06

标签: xna alphablending xna-4.0

我试图在this stackoverflow questioner试图在XNA 3.1中获得的XNA 4.0中实现相同的效果:即绘制背景,并在其上面加上带有透视'cutouts'的黑色蒙版like so

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

(注意:我最初制作了一个带有黑色背景和透明中心的简单纹理并将其绘制在顶部,但是现在我需要多个具有可能重叠的发光区域的对象,这种方法将不再起作用;因此为什么我需要找出alpha混合......)

1 个答案:

答案 0 :(得分:0)

这里有一些关于做战争迷雾的好资源,这似乎是你的目标。

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 Blending也可以获得所需的效果。第二个链接使用alpha混合和您尝试应用的相同技术。但是,示例代码适用于XNA 3.1,而不是4.0。