使用 Premake 5 和 Visual Studio 2015 将 GLSL 编译为 SPIR-V
Compiling GLSL to SPIR-V using Premake 5 and Visual Studio 2015
我不想手动将我的 GLSL 着色器编译为 SPIR-V,而是希望 Visual Studio 自动检测对着色器文件的更改,并将 运行 glslangValidator 作为构建步骤。我正在使用 Premake 生成 Visual Studio solution/project.
一个部分有效的解决方案是在 premake5.lua
中声明:
--prebuildcommands [[for %%i in (..\data\shaders\*) do (..\libs\vulkan\glslangValidator.exe -V -o "%%~dpibin\%%~nxi.spv" %%i)]]
然后 right-click shader in solution explorer -> properties -> General -> Item Type -> Custom Build Tool
。
这种方法有一些缺点:
- 只有一个着色器发生变化时,所有着色器都会重新编译
- 我不得不手动更改 VS 项目设置
我在 premake 文档中能找到的最接近的东西是:Custom Build Commands。我认为这个想法是在着色器文件上使用过滤器并生成构建命令,但我无法让任何东西工作。也许其他人有想法?
我对 Premake 一无所知,但这适用于 Visual Studio:
- 将着色器添加到您的项目
- 在每个着色器文件的 属性 页面中将
Item Type
设置为 Custom Build Tool
- 在为每个着色器文件设置的新出现的
Custom Build Tool
树中:
- 将
Command Line
设置为 $(VULKAN_SDK)\Bin32\glslangValidator -V -o $(OutDir)\%(Identity).spv %(Identity)
(对于 x32,否则 Bin
对于 x64 主机)
- 将
Description
设置为一些不错的东西,例如Compiling vertex shader
- 设置
Outputs
例如$(OutDir)\%(Identity).spv
- 将
Link Objects
设置为No
现在应该按文件工作,只正确编译修改过的文件,并在干净时删除它们。
尽管我确实更喜欢只向 post-构建步骤添加一个命令的方法(就像您所做的那样):
for %%f in (*.vert *.tesc *.tese *.geom *.frag *.comp) \
do %VK_SDK_PATH%\Bin\glslangValidator.exe -V -o $(OutDir)\%%f.spv %%f
它的好处是可以通过 属性 Sheet.
轻松添加到新项目中
看来我误解了 premake 文档中的一些内容(感谢 Nicol)。我通过做它来工作:
filter "files:../data/shaders/*"
buildcommands '"../libs/vulkan/glslangValidator.exe" -V -o "%{file.directory}/bin/%{file.name}.spv" "%{file.relpath}"'
buildoutputs "%{file.directory}/bin/%{file.name}.spv"
现在我的 Visual Studio 项目设置与 krOoze 的答案相匹配。唯一的缺点是必须为每个新着色器手动设置(或重新生成整个项目)。 Custom Rules 看起来很有趣,但目前仅支持 Visual Studio(它们也不支持同一规则中的多种扩展类型(.frag、.vert、.comp 等))。
我不想手动将我的 GLSL 着色器编译为 SPIR-V,而是希望 Visual Studio 自动检测对着色器文件的更改,并将 运行 glslangValidator 作为构建步骤。我正在使用 Premake 生成 Visual Studio solution/project.
一个部分有效的解决方案是在 premake5.lua
中声明:
--prebuildcommands [[for %%i in (..\data\shaders\*) do (..\libs\vulkan\glslangValidator.exe -V -o "%%~dpibin\%%~nxi.spv" %%i)]]
然后 right-click shader in solution explorer -> properties -> General -> Item Type -> Custom Build Tool
。
这种方法有一些缺点:
- 只有一个着色器发生变化时,所有着色器都会重新编译
- 我不得不手动更改 VS 项目设置
我在 premake 文档中能找到的最接近的东西是:Custom Build Commands。我认为这个想法是在着色器文件上使用过滤器并生成构建命令,但我无法让任何东西工作。也许其他人有想法?
我对 Premake 一无所知,但这适用于 Visual Studio:
- 将着色器添加到您的项目
- 在每个着色器文件的 属性 页面中将
Item Type
设置为Custom Build Tool
- 在为每个着色器文件设置的新出现的
Custom Build Tool
树中:- 将
Command Line
设置为$(VULKAN_SDK)\Bin32\glslangValidator -V -o $(OutDir)\%(Identity).spv %(Identity)
(对于 x32,否则Bin
对于 x64 主机) - 将
Description
设置为一些不错的东西,例如Compiling vertex shader
- 设置
Outputs
例如$(OutDir)\%(Identity).spv
- 将
Link Objects
设置为No
- 将
现在应该按文件工作,只正确编译修改过的文件,并在干净时删除它们。
尽管我确实更喜欢只向 post-构建步骤添加一个命令的方法(就像您所做的那样):
for %%f in (*.vert *.tesc *.tese *.geom *.frag *.comp) \
do %VK_SDK_PATH%\Bin\glslangValidator.exe -V -o $(OutDir)\%%f.spv %%f
它的好处是可以通过 属性 Sheet.
轻松添加到新项目中看来我误解了 premake 文档中的一些内容(感谢 Nicol)。我通过做它来工作:
filter "files:../data/shaders/*"
buildcommands '"../libs/vulkan/glslangValidator.exe" -V -o "%{file.directory}/bin/%{file.name}.spv" "%{file.relpath}"'
buildoutputs "%{file.directory}/bin/%{file.name}.spv"
现在我的 Visual Studio 项目设置与 krOoze 的答案相匹配。唯一的缺点是必须为每个新着色器手动设置(或重新生成整个项目)。 Custom Rules 看起来很有趣,但目前仅支持 Visual Studio(它们也不支持同一规则中的多种扩展类型(.frag、.vert、.comp 等))。