我正在努力弄清楚如何设置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: 我弄清楚了如何处理命令行参数。
答案 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文件的问题,还有其他一些选项,例如shaderassembleroutput
和shaderassembler
,我相信后者是将汇编代码导出到指定位置的开关,但是我还没有对它们进行任何测试来给出详尽的答案。
不幸的是,我不确定如何在输出文件中启用调试信息,因为似乎还没有预编译选项。我正在仔细阅读文档,以寻找添加用于着色器编译的/Zi
(启用调试符号)标志的任何方法,但是我不确定是否可以这样做。