我正在努力弄清楚如何设置我的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文件,我有一个简单的命名方案:
*-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文件的问题,还有其他一些选项,比如shaderassembleroutput
和shaderassembler
,后者我认为是将汇编代码导出到指定位置的开关,但是我还没有用这些来测试精心回答。
不幸的是,我不确定如何在输出文件中启用调试信息,因为似乎还没有预先选择。我正在挖掘文档以寻找为着色器编译添加/Zi
(启用调试符号)标志的任何方法,但我不完全确定它是否可行。