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