XNA在渲染中清除纹理?

时间:2012-08-14 06:15:35

标签: c# xna textures

我们正在为RenderTexture2D预渲染大量纹理,这就是我们遇到的问题:

Render issues with XNA

在渲染块时,似乎是随机的,每个单元格(顶部和侧面)的纹理都会破坏并消失。奇怪的是,它们在渲染下一个块时会回来,所以它似乎是在每帧的基础上发生的。

有没有人知道为什么会发生这种情况(而且似乎是随机的;注意白色矩形是侧面纹理腐蚀的地方,你可以从那里看到纹理只包含透明)?

编辑:立方体的两侧被保存到Texture2D但是它们仍然在一个块渲染的中间消失,然后又回到下一个。所以我不明白为什么Texture2D中的图形正在消失并返回,没有重新初始化(这是奇怪的部分)。

2 个答案:

答案 0 :(得分:1)

RenderTexture2D只是一个临时内存构造,可以非常快速地定期刷新。这是因为它被重用以节省内存并在较小程度上加快速度。因此,您应该只将其视为存储纹理的临时位置。您需要将其转换为适当的Texture2D,它将存储更长时间。只是做一个简单的事情:

Texture2D YourPic = (RenderTexture2D)SomeRenderedPic;

不会这样做。这只是将指针传递给渲染图像的存储空间。当显卡丢弃它时,它仍然会消失。你想做的更像是:

Color[] MyColorArray = new Color[SomeRenderedPic.Width * SomeRenderedPic.Height];
SomeRendeerPic.GetData<Color>(MyColorArray);
Texture2D YourPic = new Texture2D(
        GraphicsDevice,
        SomeRenderedPic.Width,
        SomeRenderedPic.Height);
YourPic.SetData<Color>(MyColorArray);

现在,如果我已经启动了那段代码,那么它应该将数据而不是指针存储到新纹理中。这使得新纹理成为自己独特的内存空间,不会像渲染目标空间那样刷新。

这种方法有一个缺点。它不能在XNA的完全刷新率下完成。 (每秒60帧......我想......也许30 ......我忘记了。)无论如何,如果你需要一个非常持续的提神,这可能还不够快。但是,如果你创建的静态纹理并没有真正发生太大变化,那么这可能会为你做到这一点。

希望这是有道理的,因为我在飞行和深夜写这篇文章。如果这不起作用我道歉。如果需要,请随时给我写jareth_gk@hotmail.com。如果我能回答你的问题,我将很乐意。

否则祝你好运,并有创造力。我相信有一个解决方案。

x Jeremy M。

答案 1 :(得分:0)

我不能说我们肯定已经解决了这个问题,但它似乎是由多个周期中的线程或拆分任务引起的。这不是RenderTarget2D的问题,因为我们当时已经这样做了。

相关问题