【问题标题】:Dynamically compiling and running shaders from file in XNA从 XNA 中的文件动态编译和运行着色器
【发布时间】:2010-09-02 02:53:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先——如果你的着色器没有入口点,你实际上并没有编译任何东西! 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,并且在 XNA 3.1 中 Effect 和使用 PixelShader 并没有太大区别,如果您选择继续使用 XNA,我建议您使用 Effect,使用 Effect.CompileEffectFromSource 编译3.1,而不是使用ShaderCompiler)

    【讨论】:

    • 首先,谢谢。而且我认为使用 XNA 4.0 会更容易。我误以为 ShaderCompiler.CompileFromFile() 方法上的“函数名”参数是为 Shader 指定入口点方法。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多