Динамически компиляция и беговые шейдеры из файла в XNA

StackOverflow https://stackoverflow.com/questions/3623544

Вопрос

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

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

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

Можно ли применить этого шейдера к сетке?

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

Это было полезно?

Решение

Прежде всего - если у вашего шейдера нет точек входа, вы на самом деле не принимаете все! Функции 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 описано здесь.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top