gpt4 book ai didi

c# - 在 XNA 中从文件动态编译和运行着色器

转载 作者:行者123 更新时间:2023-11-30 14:41:53 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

首先 - 如果您的着色器没有入口点,那么您实际上并没有编译任何东西! 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 之间并没有太大区别,我建议您使用 Effect,使用 Effect.CompileEffectFromSource 编译,如果您选择留在 XNA 3.1、不使用ShaderCompiler)

关于c# - 在 XNA 中从文件动态编译和运行着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com