Как я могу сохранить целевые результаты рендеринга, чтобы они были энергонезависимыми? - PullRequest
3 голосов
/ 06 августа 2011

Я пишу приложение в XNA, которое опирается на цели рендеринга, которые отрисовываются только один раз, а затем используются бесконечно долго.Проблема, с которой я столкнулся, заключается в том, что в определенных ситуациях содержимое целей рендеринга теряется или удаляется, например, когда компьютер переходит в спящий режим или приложение переходит в полноэкранный режим.

Повторная визуализация для каждогоЦель, когда содержимое потеряно - это вариант, но, вероятно, не самый лучший, так как он может быть довольно дорогостоящим, когда имеется много целей.

Я мог бы, вероятно, сохранить каждый результат как изображение PNG, а затем загрузить этот PNG обратно.как текстура, но это добавляет много накладных расходов на ввод / вывод.

Предложения?

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Наиболее вероятный вариант, который я нашел до сих пор, это использовать 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 голос
/ 26 октября 2013

Полагаю,

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

Нужно сделать свое дело.Это связано с тем, как шейдер-модели работают на ПК и Xbox, и как шейдер-модель 2+ сделала его равным.(Что-то в Xbox перезаписывает свой выходной буфер по умолчанию, поэтому старые цели визуализации очищаются, в то время как ПК просто использует другую память)

...