【问题标题】:XNA (3.1) DrawUserPrimitives and SpriteBatch alpha issuesXNA (3.1) DrawUserPrimitives 和 SpriteBatch alpha 问题
【发布时间】:2012-12-10 15:02:53
【问题描述】:

我正在使用 XNA 3.1 制作一些东西,并且我正在尝试使用 DrawUserPrimitives 创建 2D Ribbon 轨迹。我的算法只是在每一帧中添加新的顶点(假设发生了一些运动),并且还遍历顶点并将它们淡出,删除不需要的顶点。这工作得很好,除了我使用 SpriteBatch 来处理许多其他图形。现在,我将整个屏幕绘制到 RenderTarget2D(出于各种原因,我无法避免),并且遇到了这个奇怪的 alpha 问题。

我遇到的问题是这样的:

这应该是一条随着它消失的白色轨迹。显然这不会发生。相反,它正在褪色为图形设备的清晰颜色。绘制这条轨迹时,我暂停 SpriteBatch(通过调用 End(),然后在绘制完成后调用 Begin()),这样我就可以得到正确的深度。我用来绘制图元的效果只是一个BasicEffect,没有什么特别之处,初始化SpriteBatch的代码在这里:

        spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
        graphics.GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true;
        graphics.GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One;
        graphics.GraphicsDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha;
        graphics.GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
        graphics.GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;

初始化 SpriteBatch 后的设置可确保 RenderTarget 纹理中半透明的正确着色。我的猜测是这里的某些东西导致了这个问题,但我不确定是什么。如果有人能帮我解决这个问题,我将不胜感激。

干杯。

【问题讨论】:

    标签: c# xna vertex spritebatch


    【解决方案1】:

    哦……我修好了。需要将 SaveStateMode.SaveState 换成 SaveStateMode.None。

    仍然想知道为什么我不能对其进行抗锯齿处理...

    【讨论】:

    • 值得指出的是SaveStateMode.SaveState 对性能没有好处(在 XNA 4 中被删除)。多边形边缘的抗锯齿需要在你的后台缓冲区上设置多重采样。
    • 是的,感谢您指出这一点。我已经在后台缓冲区上设置了多重采样,并测试了在绘制多边形时它仍然是首选,并且我的硬件支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多