C# RenderTarget2D对所有alpha紫色进行着色

C# RenderTarget2D对所有alpha紫色进行着色,c#,xna,spritebatch,rendertarget,C#,Xna,Spritebatch,Rendertarget,因此,我正在尝试将我的游戏渲染到XNA中的RenderTarget2D,以便将着色器应用到场景中。从某种程度上说,它是有效的,但任何使用除255之外的alpha级别绘制的东西似乎都是紫色的。阿尔法效果正在发挥作用,但也有一种紫色的色调。我试着四处寻找一个解决方案,我能找到的只有一个,要么是全屏显示为紫色,要么是alpha显示为紫色 我的问题不完全是这些 这是我抛出来的一幕,想告诉你发生了什么。如您所见,alpha效果正在发挥作用,但对象呈紫色 下面是我发布渲染代码的部分: gameTarget

因此,我正在尝试将我的游戏渲染到XNA中的RenderTarget2D,以便将着色器应用到场景中。从某种程度上说,它是有效的,但任何使用除255之外的alpha级别绘制的东西似乎都是紫色的。阿尔法效果正在发挥作用,但也有一种紫色的色调。我试着四处寻找一个解决方案,我能找到的只有一个,要么是全屏显示为紫色,要么是alpha显示为紫色

我的问题不完全是这些

这是我抛出来的一幕,想告诉你发生了什么。如您所见,alpha效果正在发挥作用,但对象呈紫色

下面是我发布渲染代码的部分:

gameTarget = new RenderTarget2D(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, 1, SurfaceFormat.Color, RenderTargetUsage.PreserveContents);

gameDepthBuffer = new DepthStencilBuffer(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, GraphicsDevice.DepthStencilBuffer.Format);
这是我正在使用的初始化

GraphicsDevice g = GraphicsDevice;
DepthStencilBuffer d = g.DepthStencilBuffer;
g.SetRenderTarget(0, gameTarget);
g.DepthStencilBuffer = gameDepthBuffer;
g.Clear(Color.Black);
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
        level.Draw(GameBatch);

GameBatch.End();
g.SetRenderTarget(0, null);
g.DepthStencilBuffer = d;
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
        if (renderEffect != null)
        {
            renderEffect.Begin();
            renderEffect.CurrentTechnique.Passes[0].Begin();
        }
        Sprite.Draw(GameBatch, gameTarget.GetTexture(), new Rectangle(0, 0, (int)assumedSize.X, (int)assumedSize.Y), Color.White);
        if (renderEffect != null)
        {
            renderEffect.CurrentTechnique.Passes[0].End();
            renderEffect.End();
        }
        GameBatch.End();
Renderefect是效果文件,Sprite是处理相对于假定屏幕大小绘制的类,以处理不同分辨率

我在XNA3.1工作。我知道我现在应该使用4.0了,但我没有,因为我有一本关于3.1的书,这在某些情况下是有用的


无论如何,在此提供一些帮助将不胜感激……

通常紫色是默认颜色,渲染目标将被清除

考虑到这一点,我发现在将渲染目标设置为null之后,您没有清除后缓冲区。因此,您的代码应该如下所示:

g.SetRenderTarget(0, null);
g.Clear(Color.Transparent);//or black

通常,紫色是清除渲染目标的默认颜色

考虑到这一点,我发现在将渲染目标设置为null之后,您没有清除后缓冲区。因此,您的代码应该如下所示:

g.SetRenderTarget(0, null);
g.Clear(Color.Transparent);//or black

修正!我需要设置一些alpha参数:

GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One;
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;

修正!我需要设置一些alpha参数:

GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One;
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;

也许最好在mably上问这个问题,但是在你发布链接之前我不知道gamedev部分的存在。也许在mably上问这个问题更好,但是在你发布链接之前我不知道gamedev部分的存在。谢谢你,这就成功了。只需将它设置为透明黑色,它就工作了。事实上,再看一遍,它现在把所有东西都染成了黑色。没有颜色。在XNA3.1中是透明的,所以我不知道该怎么做。谢谢,这就成功了。只需将它设置为透明黑色,它就工作了。事实上,再看一遍,它现在把所有东西都染成了黑色。XNA3.1中没有颜色。透明,所以我不知道该怎么办。