2010-09-02 33 views
3

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

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

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

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

因为我不想找到每个文件的入口点来包装它的技术​​,以便它被编译为Effect

回答

6

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

所以首先(你可以通过分解得到的着色器编译后,确认此Check this question and answer for instructions。)

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

要设置显卡这个shader,在XNA 3.1,你可以使用:

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

当使用XNA内置的网状的东西,你想用ModelMeshPart.Draw提请您的网格。这绕过了所有Model的内置效果的东西。

值得指出的是,在XNA 4.0中,从XNA中删除了整个ShaderCompiler,CompiledShader,PixelShader系统。这是explained here。在XNA 4.0中动态编译效果的方法是described here。 (假设您必须在XNA 4.0中使用效果,并且XNA 3.1在效果和使用PixelShader之间没有太大差异,我会推荐您使用Effect,使用Effect.CompileEffectFromSource进行编译,如果您选择继续使用XNA 3.1 ,而不是使用ShaderCompiler

+0

Firstand首先,谢谢。而且我认为全面使用XNA 4.0会更容易。我错误地认为ShaderCompiler.CompileFromFile()方法的“函数名称”参数是为Shader指定一个入口点方法。 再次感谢! – Val 2010-09-02 07:08:53

+0

不客气:) – 2010-09-02 07:12:50

+0

+1,用于链接优秀的Shawn Hargreaves网络日志:) – Stringer 2010-09-02 12:22:50