Преобразование .dds в .png: действительно ли XNA так запутана? - PullRequest
1 голос
/ 03 октября 2010

У меня есть файл .dds, и я хочу файл .png.Хотя я уже узнал о библиотеке DevIL.NET , дизайн API одного статического класса не распараллеливается, поэтому я надеюсь найти другой метод.Это привело меня к XNA.

Но вот как далеко я продвинулся с этой идеей ...

  • ОК, похоже, я хочу этот Texture2D класс;тогда я могу позвонить myTexture2D.SaveAsPng.
  • Но как мне получить один из них из моего файла .dds?Ну, документация, кажется, указывает на то, что я хочу использовать myContentManager.Load<Texture2D>.
  • О, дерьмо, это не так, это какая-то система управления игровым контентом.Что ж, мой поиск, похоже, нашел много применений myTexture2D.LoadFile;Я пойду на это.
  • Э-э, я пропускаю ссылку на сборку или что-то?О нет, я понял, они удалили этот метод между 3.1 и 4.0, потрясающе.Ладно, это немного раздражает, но myTexture2D.LoadStream на самом деле не проблема.
  • Подождите, что это сейчас?Это хочет GraphicsDevice?Хм, похоже, что один обычно получает один из них через GraphicsDeviceManager ... о, подожди, я больше не пойду по этому пути, больше нет Manager s для меня.
  • Я думаю, я 'Я должен создать экземпляр этой вещи вручную.Хорошо, ну, это не так уж сложно ... var myGraphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, (э-э-э, что это за вещь PresentationParameters, хорошо, я просто попробую new PresentationParameters());.
  • Хорошо, это вызвало исключение. Они хотят... а DeviceWindowHandle в моем PresentationParameters? НО Я РАБОТАЮ НА КОНСОЛЬНОМ ПРИЛОЖЕНИИ !!

Так что я действительно надеюсь, что есть менее замысловатый способ сделатьэто, возможно, какое-то значение по умолчанию GraphicsDevice, которое я мог бы использовать. Довольно глупо создавать целое окно только для преобразования .dds в .png.

Альтернативные предложения для моей проблемы преобразования приветствуются, я думаю, хотявероятно, стоило бы понять, как использовать XNA из не-XNA-кода в целом.

Ответы [ 2 ]

4 голосов
/ 04 октября 2010

Если у вас есть приложение командной строки, которое должно создать графическое устройство XNA, то код в этом ответе должен помочь.

В двух словах вам понадобятся некоторыеклассы из образца WinForms , чтобы избежать необходимости возиться с созданием сервисов графического устройства и т. д. (в частности, с классами ServiceContainer и GraphicsDeviceService).

Тогда вы можете сделать это:

Form form = new Form(); // Dummy form for creating a graphics device
GraphicsDeviceService gds = GraphicsDeviceService.AddRef(form.Handle,
        form.ClientSize.Width, form.ClientSize.Height);

ServiceContainer services = new ServiceContainer();
services.AddService<IGraphicsDeviceService>(gds);
content = new ContentManager(services, "Content");

Тада - теперь у вас есть рабочий ContentManager, который вы можете использовать для загрузки материала.Я полагаю, что вы также сможете получить GraphicsDevice от GraphicsDeviceService.

Форма, которую вы создаете, никогда не отображается.Не забывайте ссылаться на System.Windows.Forms.dll в вашем проекте.

Отказ от ответственности: это было написано для XNA 3.1.Я не тестировал его в 4.0, но подозреваю, что он будет работать практически без изменений.

3 голосов
/ 03 октября 2010

От макушки головы (некоторое время не использовал XNA):

  • Преобразование типов данных не является распространенным сценарием для XNA. Ожидается, что все ресурсы будут предварительно обработаны конвейером контента.
  • XNA ожидает, что графическое устройство довольно часто, приложения без окон выходят за рамки XNA.

Мне кажется, что вы используете не тот инструмент для работы, хотя я не мог сказать другого, кроме DevIL, который вы уже уволили.

...