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