我正在XNA中编写一个应用程序,它依赖于渲染目标只渲染一次,然后无限期地使用。我遇到的问题是某些情况下渲染目标的内容丢失或丢失,例如当计算机进入睡眠状态或应用程序进入全屏模式时。
当内容丢失时重新呈现给每个目标是一种选择,但可能不是最佳选择,因为当有许多目标时,它可能相当昂贵。
我可以将每个结果保存为PNG图像,然后将该PNG作为纹理加载回来,但这会增加很多I / O开销。
建议?
答案 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只使用其他内存)