如何保留渲染目标结果,使其不易变形?

时间:2011-08-06 13:19:10

标签: xna rendering render-to-texture

我正在XNA中编写一个应用程序,它依赖于渲染目标只渲染一次,然后无限期地使用。我遇到的问题是某些情况下渲染目标的内容丢失或丢失,例如当计算机进入睡眠状态或应用程序进入全屏模式时。

当内容丢失时重新呈现给每个目标是一种选择,但可能不是最佳选择,因为当有许多目标时,它可能相当昂贵。

我可以将每个结果保存为PNG图像,然后将该PNG作为纹理加载回来,但这会增加很多I / O开销。

建议?

2 个答案:

答案 0 :(得分:4)

我目前发现的最有可能的选项是使用GetData()SetData()RenderTarget2D复制到新Texture2D.

由于我想要一个mip贴图纹理,我发现我必须将每个mip级别分别复制到新纹理,就像这样。如果不这样做,当你离开它时,对象将变黑,因为mip贴图中没有数据。请注意,渲染目标也必须是mip映射的。

Texture2D copy = new Texture2D(graphicsDevice,
    renderTarget.Width, renderTarget.Height, true,
    renderTarget.Format);

// Set data for each mip map level
for (int i = 0; i < renderTarget.LevelCount; i++)
{
    // calculate the dimensions of the mip level.
    // Math.Max because dimensions always non-zero
    int width = (int)Math.Max((renderTarget.Width / Math.Pow(2, i)), 1);
    int height = (int)Math.Max((renderTarget.Height / Math.Pow(2, i)), 1);

    Color[] data = new Color[width * height];

    renderTarget.GetData<Color>(i, null, data, 0, data.Length);
    copy.SetData<Color>(i, null, data, 0, data.Length);
}

答案 1 :(得分:1)

我相信

Presetnationparameters pp = graphics.PresentationParameters;
pp.RenderTargetUsage = RenderTargetUsage.PreserveContents;

应该做的伎俩。它与shadermodel在PC和Xbox上的工作方式有关,以及shadermodel 2+如何使其相同。 (默认情况下,Xbox会覆盖其输出缓冲区,因此旧的渲染图清晰,而PC只使用其他内存)