1

所以,我正在尝试将我的游戏玩法渲染到 XNA 中的 RenderTarget2D,这样我就可以将着色器应用到场景中。它在某种程度上是有效的,但任何以 255 以外的 alpha 级别绘制的东西似乎都被染成了紫色。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();

renderEffect 是效果文件,Sprite 是处理相对于假定屏幕尺寸的绘图(以应对不同的分辨率)的类。

我在 XNA 3.1 中工作。我知道我现在应该使用 4.0,但我不是因为我有 3.1 的书,这在某些情况下很有帮助。

无论如何,这里的一些帮助将不胜感激......

4

2 回答 2

3

通常紫色是 RenderTarget 被清除的默认颜色。

考虑到这一点,我发现在将渲染目标设置为null. 所以你的代码应该是这样的:

g.SetRenderTarget(0, null);
g.Clear(Color.Transparent);//or black
于 2012-05-11T10:55:58.630 回答
1

固定的!我需要设置一些 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;
于 2012-05-12T01:22:18.987 回答