Premake5:如何构建HLSL着色器?

时间:2019-03-08 00:48:29

标签: hlsl premake directx-12

我正在努力弄清楚如何设置hlsl着色器以与Premake5和Visual Studio 2017一起使用。

作为预构建步骤,我不知道如何告诉Premake5编译我的hlsl着色器。

这是我进行此预构建步骤的目标:

  
      
  • 指定着色器模型
  •   
  • 指定调试/发布编译
  •   
  • 仅编译已更改的文件
  •   
  • 生成dxasm文件
  •   
  • 将生成的* .asms和* .cso放置在适当的发行/调试文件夹中
  •   

更新1: 经过进一步调查,我发现Premake5的buildaction直接引用了FxCompile

更新2: 感谢mukunda。我能够完美地配置我的项目! 我必须从源代码构建premake5才能运行此premake脚本。

因为从2019年3月开始,二进制分发版不支持大于5的着色器模型。

   hf.deactivate_filter()

   files(src_dir.."shaders/*.hlsl")
   shadermodel("6.3")

   shaderassembler("AssemblyCode")

   local shader_dir = _WORKING_DIR.."/"..src_dir.."shaders/%{cfg.buildcfg}/"

   -- HLSL files that don't end with 'Extensions' will be ignored as they will be
   -- used as includes
   filter("files:**.hlsl")
      flags("ExcludeFromBuild")
      shaderobjectfileoutput(shader_dir.."%{file.basename}"..".cso")
      shaderassembleroutput(shader_dir.."%{file.basename}"..".asm")

   filter("files:**_ps.hlsl")
      removeflags("ExcludeFromBuild")
      shadertype("Pixel")

   filter("files:**_vs.hlsl")
      removeflags("ExcludeFromBuild")
      shadertype("Vertex")

   hf.deactivate_filter()

   -- Warnings as errors
   shaderoptions({"/WX"})

更新3: 我弄清楚了如何处理命令行参数。

1 个答案:

答案 0 :(得分:1)

我今天只是在搞弄这个。对于我的HLSL文件,我有一个简单的命名方案:

  • *-p.hlsl用于像素着色器文件。
  • *-v.hlsl用于顶点着色器文件。
  • *.hlsl用于要由着色器程序包含的通用文件。我只是使用hlsl扩展名,以便在编辑器中以正确的HLSL语法突出显示它。

您不需要自定义构建规则来编译它们。 Premake似乎能够在Visual Studio项目中输出适当的块以使用着色器编译器,然后只处理已更改的文件(具有#include依赖项)之类的事情就可以了。这是我的配置块:

filter { "files:**.hlsl" }
   flags "ExcludeFromBuild"
   shadermodel "5.0"
filter { "files:**-p.hlsl" }
   removeflags "ExcludeFromBuild"
   shadertype "Pixel"
   shaderentry "ForPixel"
filter { "files:**-v.hlsl" }
   removeflags "ExcludeFromBuild"
   shadertype "Vertex"
   shaderentry "ForVertex"
filter {}

基本上为我的文件设置了着色器模型和入口点(对于DirectX 12,您可能需要shadermodel "6.0")。然后,我可以通过files将着色器添加到项目中:

files { "shaders/**.hlsl"; }

这是预制件中所有非常新的东西,因此您不会在其中找到太多文档。我在这里看到了这些选项:https://github.com/premake/premake-core/blob/master/modules/vstudio/_preload.lua

对于您有关导出dxasm文件的问题,还有其他一些选项,例如shaderassembleroutputshaderassembler,我相信后者是将汇编代码导出到指定位置的开关,但是我还没有对它们进行任何测试来给出详尽的答案。

不幸的是,我不确定如何在输出文件中启用调试信息,因为似乎还没有预编译选项。我正在仔细阅读文档,以寻找添加用于着色器编译的/Zi(启用调试符号)标志的任何方法,但是我不确定是否可以这样做。