运行 如果仅修改着色器代码,SPIR-V 编译器将作为 VS2017 中的预构建事件

Running SPIR-V compiler as pre-build event in VS2017 if only the shader code was modified

所以我在这里查看了一些搜索后弹出的问题,但我仍然没有成功。

我的项目有两个文件,main.cppshader.comp

着色器需要在主程序 运行 之前编译,我有一个小的 .bat 脚本可以做到这一点。它设置为 运行 作为预构建事件。

但是,如果我编辑 shader.comp 并保留 main.cpp 自上次 运行 项目以来未修改,则无需重建项目(无论如何根据 VS),所以不需要 运行 任何预构建事件,我的着色器不会被编译。

有没有办法告诉VS2017(或VS2019),如果某个文件被修改,那么运行 某事 ,或者至少是一种将任意文件添加到 VS 在决定是否 运行 构建时检查的文件列表的方法?

我尝试在文件属性中将 "Exclude from build" 设置为 "No",但无论我选择什么 "Item type",仅编辑着色器都不会触发重建。

也许您可以从 那里得到一些帮助。您可以为 VS Up-To-Date check.

指定文件
<Project...>
...
  <ItemGroup>
    <UpToDateCheckInput Include="shader.comp" />  <!--when this file is in the project folder-->
    <!--<UpToDateCheckInput Include="path/shader.comp" />-->
  </ItemGroup>
</Project>

并将此脚本放入您的项目文件中。然后,如果 shader.comp 文件有任何更改,VS 将构建您的项目。

注意:这样,如果只更改shader.comp文件,但不更改源文件(xx,cpp),构建将开始,但vs 将跳过 C++ 源代码的编译目标。只有当你修改源代码main.cpp时,VS才会运行预构建事件并编译代码。让我知道这是否是您想要的,希望我没有误解任何东西:)

可以在文件的属性中将需要编译的shader定义为Custom Build Tool(如Item Type)。这将在属性中打开另一个菜单,其中可以编写 cmd 脚本和类似内容。

在此特定情况下,Command Line 的值为:

glslangValidator.exe -V -o "%(RootDir)%(Directory)%(Filename).spv" "%(FullPath)"

Outputs:

%(RootDir)%(Directory)%(Filename).spv

简而言之,如果 Outputs 中定义的文件不存在或早于此 属性(需要编译的文件)的所有者,则 Command Line cmd 中的参数将是 运行。

Official documentation 对此有更多信息。