【问题标题】:How to build shader effect (.fx) in csproj如何在 csproj 中构建着色器效果 (.fx)
【发布时间】:2015-10-08 18:21:54
【问题描述】:

我正在尝试在 C# 类库中构建像素着色器。

我已将 fx 文件添加到项目中。由于找不到任何合适的构建操作,我尝试手动编辑 csproj:

<FxCompile Include="MyEffect.fx">
  <ShaderType>Pixel</ShaderType>
</FxCompile>

但是当我尝试定位 ps 文件时,我得到了System.IO.IOException: Cannot locate resource 'MyEffect.ps'

这是引发错误的代码:

 public class MyEffect : ShaderEffect
 {
   public MyEffect(){
     this.PixesShader = new Uri("pack://application:,,,/WpfControlLibrary1;component/MyEffect.ps");
   }
 }

如何设置我的项目以便我可以找到编译后的着色器?

我找到的所有教程都是针对 C++ 项目或处理自定义构建任务等旧工具的,但我认为从 VS2012 开始就不需要了。

编辑: Visual Studio 仅在 C++ 项目中编译 .fx 文件。在 C# 项目中它不起作用。这里提到了:http://blogs.msdn.com/b/chuckw/archive/2012/05/07/hlsl-fxc-and-d3dcompile.aspx

【问题讨论】:

  • 任何添加到cs项目的文件都会有一个名为Build Action的属性,它应该是Resource。看起来您对其进行了编辑以使用编译,这当然行不通。除非您完全了解您所做的工作,否则您不应直接编辑项目文件。您的代码看起来不错,我认为问题只是因为 Build Action 设置为 Compile,这是错误的。
  • 好吧,我已将其设置为 FxCompile,而不是 Compile。我在一些 cpp 项目中注意到 FxCompile。构建操作Resource 不起作用,因为必须先将 .fx 文件编译为 .ps 文件并将其添加到资源中。请注意,资源名称是 MyEffect.ps 而不是 MyEffect.fx
  • 我告诉你将其Build Action 设置为Resource 是文件.ps。顺便说一句,我什至编写了一个仅包含自定义效果的简单库,并且我确信.ps 文件应该将Build Action 设置为Resource。您对 csproject 文件所做的操作应该回滚(以确保它不会影响您接下来的操作)。如果可能,请尝试再次创建一个新项目。
  • 但我还没有 .ps 文件。所以你是说我必须使用 fxc.exe 手动编译 hlsl?
  • 是的,其实我用的是Shazzam(支持HLSL编辑器和预览)。所以你想让VS编译HLSL源代码?据我所知 VS 2012 不能做到这一点,不确定新版本。或者它可能带有一些帮助这样做的插件。

标签: wpf msbuild directx csproj pixel-shader


【解决方案1】:

您可以设置 Postbuild 选项以使用 fxc 编译您的 fx 文件:

fxc /O0 /Fc /Zi /T  fx_5_0 /Fo myShader.fxo myShader.fx

但我在开发时会在运行时编译所有着色器。 我不确定您使用的是什么 C# 库,但您可以在 SharpDX 和 SlimDX 中执行此操作:

ShaderBytecode.CompileFromFile(effectFile, "fx_5_0", ShaderFlags.None, EffectFlags.None);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2010-12-28
    • 2012-09-28
    • 2022-10-04
    相关资源
    最近更新 更多