我想知道是否可以从文件动态编译像素着色器并将其应用于网格。
首先,我将从一些背景信息开始。我有一个基于一系列数据创建 HLSL 像素着色器的系统,这对问题并不重要。重要的是这些着色器不使用技术或通道。因为它们不打算用作 .fx 文件。
该ShaderCompiler.CompileFromFile()
方法能够成功地将文件编译成CompiledShader
.
是否可以将此着色器应用于网格?
因为我不想找到每个文件的入口点以将其包装在一种技术中以允许将其编译为Effect
.
我想知道是否可以从文件动态编译像素着色器并将其应用于网格。
首先,我将从一些背景信息开始。我有一个基于一系列数据创建 HLSL 像素着色器的系统,这对问题并不重要。重要的是这些着色器不使用技术或通道。因为它们不打算用作 .fx 文件。
该ShaderCompiler.CompileFromFile()
方法能够成功地将文件编译成CompiledShader
.
是否可以将此着色器应用于网格?
因为我不想找到每个文件的入口点以将其包装在一种技术中以允许将其编译为Effect
.
首先 - 如果你的着色器没有入口点,你实际上并没有编译任何东西!HLSL 函数(听起来像是您正在使用的函数)从 entry point 开始内联。如果你没有入口点,那么你得到的是一个空着色器。
(您可以在编译后通过反汇编生成的着色器来确认这一点。检查此问题和答案以获取说明。)
所以首先 - 你将不得不编写代码来生成技术包装器。粗略地解析您的源代码并发现函数名称应该不难。您可以将源加载到缓冲区中并附加生成的技术声明。然后使用您从该缓冲区创建的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 4.0 中已从 XNA 中删除。这是解释here。此处描述了在 XNA 4.0 中动态编译效果的方法。
(鉴于您必须在 XNA 4.0 中使用 Effect,并且在 XNA 3.1 中 Effect 和使用 PixelShader 之间并没有太大区别,我建议您使用 Effect,Effect.CompileEffectFromSource
如果您选择继续使用 XNA 3.1,而不是使用,则使用 编译ShaderCompiler
)