Динамическая компиляция и запуск шейдеров из файла в XNA - PullRequest
3 голосов
/ 02 сентября 2010

Мне интересно, возможно ли динамически скомпилировать пиксельный шейдер из файла и применить его к сетке.

Сначала я просто начну с некоторой справочной информации. У меня есть система, которая создает пиксельные шейдеры HLSL на основе диапазона данных, который не очень важен для вопроса. Важно то, что эти шейдеры не используют приемы или пассы. Так как они не предназначены для использования в качестве файлов .fx.

Метод ShaderCompiler.CompileFromFile() может успешно скомпилировать файл в CompiledShader.

Возможно ли применить этот шейдер к сетке?

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

1 Ответ

6 голосов
/ 02 сентября 2010

Прежде всего - если у вашего шейдера нет точки входа, вы на самом деле ничего не компилируете!Функции HLSL (похоже, именно с этим вы работаете) встроены , начиная с точки входа .Если у вас нет точки входа, то у вас есть пустой шейдер.

(Вы можете подтвердить это, разобрав получившийся шейдер после компиляции. Проверьте этот вопрос и ответьте на инструкции .)

Итак, прежде всего - вам нужно будет написать код для генерации техник-оберток. не должно быть сложным для грубого анализа вашего источника и определения имени функции.Вы можете загрузить исходный код в буфер и добавить сгенерированное объявление метода.Затем используйте версию ShaderCompiler.CompileFromFile, которая берет Stream, который вы создаете из этого буфера.

Чтобы установить этот шейдер на графическую карту, в XNA 3.1 вы можете использовать:

CompiledShader cs = ShaderCompiler.CompileFromFile(...);
PixelShader ps = new PixelShader(graphicsDevice, cs.GetShaderCode());
graphicsDevice.PixelShader = ps;

При использовании встроенных в XNA мешей вы хотите использовать ModelMeshPart.Draw для рисования ваших мешей.Это обходит все встроенные в Model эффекты.

Стоит отметить, что вся система ShaderCompiler, CompiledShader, PixelShader была удалена из XNA в XNA 4.0.Это объяснено здесь .Способ динамической компиляции эффектов в XNA 4.0 описан здесь .

(Учитывая, что вы должны использовать Effect в XNA 4.0, и что в XNA 3.1 нет особой разницы между Effect иPixelShader, я бы порекомендовал вам использовать Effect, компилируя с Effect.CompileEffectFromSource, если вы решите остаться на XNA 3.1 вместо ShaderCompiler)

...