Это не динамическое изменение размера, нет; единственная проблема с использованием RenderTarget2D, как если бы это был Texture2D, заключается в том, что содержимое является изменчивым. Я использую цель закадрового рендера с заданным размером. Я не уверен, что вы предлагаете.
уб, учусь каждый день. Я только что разработал, как объединить несколько текстур в одну, используя RenderTarget2D. Однако, хотя я могу использовать RenderTarget2D в качестве Texture2D для большинства целей, есть критическое различие: эти визуализированные текстуры теряются при изменении размера буферного буфера (и, без сомнения, при других обстоятельствах, например, на графическом устройстве с нехваткой памяти).
На данный момент я просто копирую готовый RenderTarget2D в новый энергонезависимый объект Texture2D. Мой код, чтобы сделать это довольно глупо, хотя. Есть ли более изящный способ сделать это? Может быть, я просто устал, но я не могу найти ответ на Google или SO.
Немного упрощено:
public static Texture2D MergeTextures(int width, int height, IEnumerable<Tuple<Texture2D, Color>> textures)
{
RenderTarget2D buffer = new RenderTarget2D(_device, width, height);
_device.SetRenderTarget(buffer);
_device.Clear(Color.Transparent);
SpriteBatch spriteBatch = new SpriteBatch(_device);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
// Paint each texture over the one before, in the appropriate color
Rectangle rectangle = new Rectangle(0, 0, width, height);
foreach (Tuple<Texture2D, Color> texture in textures)
spriteBatch.Draw(texture.Item1, rectangle, texture.Item2);
spriteBatch.End();
_device.SetRenderTarget((RenderTarget2D)null);
// Write the merged texture to a Texture2D, so we don't lose it when resizing the back buffer
// This is POWERFUL ugly code, and probably terribly, terribly slow
Texture2D mergedTexture = new Texture2D(_device, width, height);
Color[] content = new Color[width * height];
buffer.GetData<Color>(content);
mergedTexture.SetData<Color>(content);
return mergedTexture;
}
Я полагаюдолжен проверьте IsContentLost и повторите визуализацию по мере необходимости, но это происходит в середине моего основного цикла рисования, и, конечно, вы не можете вкладывать SpriteBatches. Я мог бы поддерживать список «render TODO», обрабатывать их после окончания основного SpriteBatch, и тогда они будут доступны для следующего кадра. Это предпочтительная стратегия?
Этот код вызывается только несколько раз, поэтому производительность не имеет значения, но я хотел бы узнать, как все делать правильно.