Premake5:如何构建 HLSL 着色器?

Premake5: How to build HLSL shaders?

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

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

以下是我在此预构建步骤中的目标:

  • Specify shader model
  • Specify debug/release compilation
  • Only compile files that have changed
  • Produce dxasm files
  • Place resulting *.asms and *.cso in appropriate release/debug folders

更新 1: 进一步调查我发现 Premake5 有 buildaction which makes direct reference to FxCompile.

更新 2: 感谢穆昆达。我能够完美地配置我的项目! 我必须从源代码构建 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: 我想出了如何处理命令行参数。

我今天只是在胡闹。对于我的 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"; }

这是 premake 中的全新内容,因此您不会找到太多关于它的文档。我在这里看到了这些选项:https://github.com/premake/premake-core/blob/master/modules/vstudio/_preload.lua.

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

不幸的是,我不太确定如何在输出文件中启用调试信息,因为似乎还没有预制选项。我正在浏览文档以寻找任何方法来为着色器编译添加 /Zi(启用调试符号)标志,但我不完全确定是否可行。