Premake5:如何构建HLSL着色器?

问题描述 投票:2回答:1

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

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

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

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

更新1:进一步调查我发现Premake5有buildaction直接引用FxCompile

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

因为截至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 premake directx-12
1个回答
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"; }

这是premake中所有非常新的东西,所以你不会找到很多关于它的文档。我在这里看到了这些选项:https://github.com/premake/premake-core/blob/master/modules/vstudio/_preload.lua

至于你关于导出dxasm文件的问题,还有其他一些选项,比如shaderassembleroutputshaderassembler,后者我认为是将汇编代码导出到指定位置的开关,但是我还没有用这些来测试精心回答。

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

© www.soinside.com 2019 - 2024. All rights reserved.