从XNA中的文件动态编译和运行着色器

时间:2010-09-02 02:53:46

标签: c# compiler-construction xna hlsl pixel-shader

我想知道是否有可能从文件中动态编译像素着色器并将其应用到网格中。

首先,我将从一些背景信息开始。我有一个系统,它根据一系列数据创建HLSL像素着色器,这对这个问题并不重要。重要的是这些着色器不使用技术或通行证。因为它们不打算用作.fx文件。

ShaderCompiler.CompileFromFile()方法能够将文件成功编译为CompiledShader

是否可以将此着色器应用于网格?

因为我不想找到每个文件的入口点以将其包装在允许将其编译为Effect的技术中。

1 个答案:

答案 0 :(得分:6)

首先 - 如果你的着色器没有入口点,你实际上并没有编译任何东西! HLSL函数(听起来就像你正在使用的那样)从入口点开始内联。如果你没有入口点,那么你得到的是一个空的着色器。

(您可以在编译之后通过反汇编生成的着色器来确认这一点。Check this question and answer for instructions。)

首先,你 将不得不编写代码来生成技术包装器。它不应该 难以粗略地解析您的源并发现函数名称。您可以将源加载到缓冲区并附加生成的技术声明。然后使用ShaderCompiler.CompileFromFile版本,该版本采用您从该缓冲区创建的Stream

要在显卡上设置此着色器,请在XNA 3.1中使用:

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

使用XNA的内置网格物体时,您希望使用ModelMeshPart.Draw绘制网格物体。这绕过了所有Model的内置效果。

值得指出的是,整个ShaderCompilerCompiledShaderPixelShader系统已从XNA 4.0中的XNA中删除。这是explained here。在XNA 4.0中动态编译效果的方法是described here

(鉴于你必须在XNA 4.0中使用Effect,并且在效果和使用PixelShader之间的XNA 3.1中没有太大区别,我建议你使用效果,使用Effect.CompileEffectFromSource进行编译,如果你选择留下在XNA 3.1上,而不是使用ShaderCompiler