Хорошо, после нескольких копаний и часов исследований я решил свою проблему.
Вот что нужно сделать:
Вы не можете сериализовать Texture2D и загрузить его обратно. Хотя загрузка, очевидно, выполняется без проблем (поскольку мы загружаем Texture2D с помощью менеджера контента в любой игре 2D XNA), мы не можем сохранить его для загрузки из игры. После дальнейшего изучения проблемы я обнаружил класс Texture2DContent (в графическом конвейере), который, я думал, будет сериализован в Texture2D (который оказывается совершенно правильным).
Итак, я просто подключил новый экземпляр класса Texture2DContent, но не нашел способа установить его данные в мое растровое изображение. Просматривал все библиотеки DLL и базовые / производные классы, но никак не мог. Затем я реализовал класс TextureImporter, который имеет метод импорта. Он принимает имя файла и ContentImporterContext, который был сложным классом, который также имел конструкторы из других глубоко работающих внутренних классов, и я просто знал, что не смог правильно его инициализировать. Поэтому я попытался передать null в качестве моего параметра в метод импорта, войдя в код, чтобы увидеть мое исключение NullPointerException, но, как ни странно, это сработало, и вывел мой файл. Я проверил XNB, и это была просто правильная текстура. Вот мой код:
TextureImporter importer = new TextureImporter();
Texture2DContent tc = importer.Import(item, null) as Texture2DContent;
AssetWriter.Write(item.Substring(item.Replace('\\', '/').LastIndexOf('/') + 1), tc);
где item - это просто имя файла, и AssetWriter делает это практически (некоторые методы там, но я вставил их вместе ниже):
Type compilerType = typeof(ContentCompiler);
cc = compilerType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0].Invoke(null) as ContentCompiler;
compileMethod = compilerType.GetMethod("Compile", BindingFlags.NonPublic | BindingFlags.Instance);
string fullPath = Path.Combine(basePath, path, objectName + ".xnb");
using (FileStream fs = File.Create(fullPath))
{
compileMethod.Invoke(cc, new object[]{
fs, objectToWrite, TargetPlatform.Windows, GraphicsProfile.Reach, false/*true*/, fullPath, fullPath
});
}
Просто так работает. Программа передает все необходимое компилятору контента, а компиляция выполняет свою работу. Он корректно обрабатывает Texture2DContent и отображает его на XNB-вывод Texture2D, который затем может быть загружен с помощью метода load для contentManager.