XNA и RenderTargets
У меня проблема с использованием целей рендеринга, и я надеюсь, что кто-нибудь сможет мне это объяснить. Я пытаюсь использовать цель рендеринга для рендеринга некоторых спрайтов, а затем нарисовать указанную цель рендеринга в нормальный задний буфер на 50% непрозрачным (нулевым). Это прекрасно работает, за исключением случаев, когда я использую цель более одного раза в вызове отрисовки, и в этом случае на экране появится только последняя группа спрайтов.
Вот некоторый код psuedo.
// Normal Sprite Drawing.
DrawSomeSprites();
SetRenderTarget(CompositeTarget);
// These go on the render target.
DrawSomeMoreSprites();
SetRenderTarget(null);
// And now I draw onto the back buffer.
DrawSprite(CompositeTarget);
// So now I want to draw another bunch of sprites via my render target using the same approach.
SetRenderTarget(CompositeTarget);
// These are the only sprites that I can see on the screen.
DrawSomeMoreSprites();
SetRenderTarget(null);
DrawSprite(CompositeTarget);
Я надеюсь, что в этом есть смысл. Мне кажется, что каждый раз, когда я меняю цель рендеринга, предыдущая цель рендеринга (ноль) по какой-то причине очищается. Я заканчиваю все свои партии спрайтов перед тем, как менять цели, и я не получаю никаких ошибок, поэтому я не знаю, что здесь делать. Очевидно, что цель состоит в том, чтобы иметь возможность видеть все мои группы спрайтов на экране одновременно. Что мне здесь не хватает??
1 ответ
Эта статья объясняет, почему ваши цели рендеринга очищаются.
По сути, это изюминка работы графической системы XBox. Есть только одна область памяти, в которую может рендерить XBox GPU, и она довольно маленькая. Когда вы меняете цели рендеринга, эта память забивается. В XNA 2.0 (как объясняется в статье) поведение Windows по умолчанию было изменено, чтобы соответствовать поведению Xbox 360, чтобы обеспечить согласованность и скорость на разных платформах.
Параметр для выбора поведения, которое вы хотите RenderTargetUsage
, Просто имейте в виду, что сохранение содержимого на XBox происходит медленно.
Кроме того, вы можете изменить порядок рендеринга, чтобы не столкнуться с этой проблемой.