MonoGame в Linux не может загрузить активы эффекта

РЕДАКТИРОВАТЬ: проблема теперь решена, я включаю подробности здесь, чтобы помочь всем, кто столкнется с этим, так как это не так просто решить.

В основном все сводится к обновлению с помощью ветки разработки.

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

После этого вы можете скомпилировать MonoGame.Framework.Linux.sln и обновить ссылки в вашем проекте, чтобы они указывали на новые DLL-файлы.

Это по-прежнему не загрузит файлы эффектов, если они не созданы с использованием последней версии обработчиков контента, поэтому вам нужно перейти на компьютер с Windows, проверить ветку разработки (и библиотеки) или скопировать их из вашего Linux. system — затем скомпилируйте MonoGame.ContentPipeline/ContentProcessors/MonoGameContentProcessors.sln

Вам необходимо обновить ссылку на MonoGameContentProcessors.dll в вашем проекте содержимого, вам также необходимо переименовать файл MonoGame.ContentPipeline\ContentProcessors\bin\Release\libmojoshader_32.dll в просто libmojoshader.dll.

Как только все это будет сделано, вы, наконец, сможете использовать его по назначению — собрать файлы .xnb из ваших файлов .fx и добавить их в проект linux.

Надеюсь кому-то эта информация будет полезна.

================================================ Оригинал сообщение:

Я только начал работать с MonoGame и пытаюсь заставить очень простое приложение (вращающийся куб) работать в Windows и Linux — Windows не является проблемой, но у меня возникают проблемы с работой файлов .fx. Линукс.

Я настроил «Проект контента MonoGame», добавил к нему файл .fx, выбрал процессор «MonoGame Effect», установил конфигурацию сборки для Linux — все это работает, и я получаю файл .xnb в выходном каталоге. .

Когда я настраивал проект Linux, я скопировал .xnb в папку «Content» (корневой каталог установлен соответственно) и использовал следующий код для загрузки эффекта (тот же код, что и в Windows):

CubeEffect = Content.Load<Effect>("Effect1");
CubeEffect.CurrentTechnique = CubeEffect.Techniques["Technique1"];

Затем это приводит к сбою приложения с этой ошибкой:

Microsoft.Xna.Framework.Content.ContentLoadException: Could not load Effect1 asset!

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

Texture2D Tex = Content.Load<Texture2D>("bg.png");

Это работает отлично (проверил свойства Texture2D в отладчике, и у него есть правильные данные для файла).

Я где-то пропустил шаг при преобразовании файла шейдера? Есть ли какая-то действительно очевидная вещь, которую я не вижу?

Если нет, то знает ли кто-нибудь, почему он будет действовать так, или какой-то способ получить от него более подробную информацию об ошибке, например, реальную причину невозможности загрузить актив?

РЕДАКТИРОВАТЬ: Посмотрев на момент разборки, где он фактически выдает ошибку, кажется, что он находит файл, но не распознает его как какой-либо допустимый тип ресурса - может ли это быть какая-то проблема версии/совместимости?


person George Quinn    schedule 12.06.2013    source источник
comment
Обычно вам не нужно добавлять расширение файла для содержимого, но если добавление .png помогло для файла изображения, возможно, добавление .fx к файлу эффекта решит проблему...   -  person gareththegeek    schedule 12.06.2013
comment
.png отлично работает с расширением или без него, если я укажу эффект как .fx, он просто будет иметь ту же ошибку, что и раньше, если я укажу как .xnb, вместо этого появится сообщение Не удалось найти соответствующий читатель контента типа.   -  person George Quinn    schedule 12.06.2013
comment
Я бы хотел, чтобы MS не уволил XNA.. все было намного проще. Подумываю вернуться к XNA с обновлением VS2013. 117230   -  person JensB    schedule 31.08.2014


Ответы (1)


Это очень распространенная проблема при попытке загрузить шейдеры в Monogame. Я попытался, но не смог загрузить свой собственный шейдер в среду Monogame.

Собирать нужно из ветки develop3d, а не из официального релиза. Вам также необходимо преобразовать шейдер HLSL в синтаксис, совместимый с MojoShader. Затем вам нужно либо загрузить эффект из средства импорта контента Monogame (которое необходимо настроить вручную), либо добавить свой шейдер в качестве встроенного ресурса и загрузить его в свой проект, чтобы использовать его.

Я никогда не был в состоянии осуществить это самостоятельно. Судя по моим чтениям в Интернете, эта конкретная часть фреймворка Monogame еще не совсем готова для прайм-тайма.

Вот некоторая информация об этом. Они действительно не предоставили много информации об этом, поскольку я подозреваю, что они знают, что это очень проблематично:

https://github.com/mono/MonoGame/wiki/Effects-And-Shaders

person jgallant    schedule 13.06.2013
comment
видимо, я даже не могу дойти до компиляции исходников... кажется, есть некоторые проблемы с openTK. - person George Quinn; 13.06.2013
comment
некоторое улучшение - скомпилирован фреймворк monogame для linux, теперь ошибка - это неправильная версия файла MGFX, предполагая, что это означает, что мне нужно скомпилировать последнюю версию monogame.contentpipeline и использовать ее в проекте VS2010, используемом для создания файлов .xnb - person George Quinn; 13.06.2013
comment
Кстати, для тех, у кого есть аналогичная проблема с компиляцией, вам нужно проверить субмодуль сторонних/libs из репозитория, чтобы получить правильную dll openTK. - person George Quinn; 13.06.2013
comment
Теперь все работает, спасибо за информацию - я изменю свой исходный пост с подробностями того, что я сделал. - person George Quinn; 13.06.2013
comment
@GeorgeQuinn Рад, что у тебя все получилось. Спасибо за подробное описание того, как вы этого добились. - person jgallant; 13.06.2013