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

C# 从XNA中的文件动态编译和运行着色器,c#,compiler-construction,xna,hlsl,pixel-shader,C#,Compiler Construction,Xna,Hlsl,Pixel Shader,我想知道是否有可能从文件中动态编译一个像素着色器并将其应用于网格 首先,我将从一些背景信息开始。我有一个基于一系列数据创建HLSL像素着色器的系统,这些数据对问题并不重要。重要的是,这些着色器不使用技术或过程。因为它们不打算用作.fx文件 ShaderCompiler.CompileFromFile()方法能够成功地将文件编译成CompiledShader 是否可以将此着色器应用于网格 因为我不想找到每个文件的入口点,用一种技术来包装它,使它能够编译成效果 首先-如果你的着色器没有入口点,那么你

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

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

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

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


因为我不想找到每个文件的入口点,用一种技术来包装它,使它能够编译成
效果

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

(编译生成的着色器后,可以通过分解该着色器来确认这一点。)

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

要在图形卡上设置此着色器,在XNA 3.1中,可以使用:

CompiledShader cs = ShaderCompiler.CompileFromFile(...);
PixelShader ps = new PixelShader(graphicsDevice, cs.GetShaderCode());
graphicsDevice.PixelShader = ps;
使用XNA的内置网格工具时,您需要使用
ModelMeshPart.Draw
来绘制网格。这绕过了所有
模型的内置效果

值得指出的是,整个
着色器compiler
CompiledShader
PixelShader
系统已在XNA 4.0中从XNA中删除。这是。在XNA4.0中动态编译效果的方法是


(考虑到您必须在XNA 4.0中使用Effect,并且在XNA 3.1中Effect和使用PixelShader没有太大区别,如果您选择继续使用XNA 3.1,我建议您使用Effect编译,而不是使用
ShaderCompiler

首先,谢谢。我认为使用XNA4.0会更容易。我误以为ShaderCompiler.CompileFromFile()方法上的“function name”参数是为着色器指定入口点方法。再次感谢!