【问题标题】:SpriteBatch draws to backbuffer instead of RenderTarget?SpriteBatch 绘制到后台缓冲区而不是 RenderTarget?
【发布时间】:2016-11-10 03:50:12
【问题描述】:

这是一个绘图块:

graphicsDevice.Clear(Color.CornFlowerBlue);
spriteBatch.Begin();
graphicsDevice.SetRenderTarget(renderTarget);
spriteBatch.Draw(texture2D, position, etc);
graphicsDevice.SetRenderTarget(null);
graphicsDevice.Clear(Color.Red);
spriteBatch.End();

这会在红色背景上生成我的 Texture2D。为什么这会将我的 Texture2D 绘制到屏幕上?当调用 spriteBatch.Draw 时,RenderTarget 不是后备缓冲区,并且我没有在此代码中绘制 RenderTarget。由于在屏幕外绘制,texture2D 不应该不显示吗?另外,除非我在结束 spriteBatch 之前清除屏幕,否则为什么什么都不显示(只是黑色)??

【问题讨论】:

    标签: c# xna draw monogame spritebatch


    【解决方案1】:

    试着把源代码这样排列,

    graphicsDevice.Clear(Color.CornFlowerBlue);
    graphicsDevice.SetRenderTarget(renderTarget);
    spriteBatch.Begin();
    spriteBatch.Draw(texture2D, position, etc);
    spriteBatch.End();
    

    根据我的经验,您需要在实际开始使用 sprite 批绘制之前设置渲染目标。

    为什么你的后台缓冲区在你完成后是黑色的,这是因为.SetRenderTarget(null); 清除了后台缓冲区以及渲染目标,这就是屏幕拉黑的原因(什么都没有)。您应该先完成所有 RenderTarget 绘图,这样当您切换回后台缓冲区时,它不会擦除任何内容。

    【讨论】:

    • 好的,但是为什么在我的倒数第二行清除 GraphicsDevice 会导致屏幕从黑色变为红色并在其上绘制纹理?
    • 这是关于你的代码的顺序,你在结束你的精灵批处理之前清除和填充屏幕,这实际上是把精灵绘制到屏幕上。
    • 对,但在我的代码中,我在 End() 之前做的最后一件事是 Clear(),但不知何故我的 Texture2D 仍然可见。它会更改背景颜色,但不会删除 Texture2D。
    • 因为在调用 End() 之前,SpriteBatch 不会绘制到设备上。这就是精灵批处理更快的原因,它们本质上是“存储”绘制调用,然后在您调用 End() 时将它们全部推送到图形卡。这样做的原因是,它不是真正的绘图需要时间并减慢渲染速度,将信息发送到显卡并返回。可以将其想象为一次发送一堆信件,而不是一次将一封信发送到邮箱。在您真正发送它们之前,对邮箱做了什么并不重要。
    • 通过调用 Clear(Color.Red) 然后 End() 来清除空白画布,然后绘制精灵批次。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多