【问题标题】:Running SPIR-V compiler as pre-build event in VS2017 if only the shader code was modified如果仅修改了着色器代码,则在 VS2017 中将 SPIR-V 编译器作为预构建事件运行
【发布时间】:2019-12-23 14:09:31
【问题描述】:

所以我在这里查看了一些搜索后弹出的问题,但我仍然没有设法让它发挥作用。

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

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

但是,如果我在上次运行项目后编辑 shader.comp 并保持 main.cpp 未修改,则无需重新构建项目(无论如何根据 VS),因此无需运行任何预构建事件和我的着色器没有被编译。

有没有办法告诉 VS2017(或 VS2019)如果 some file 被修改,然后运行 ​​something,或者至少有一种方法可以将任意文件添加到VS 在决定是否运行构建时检查的文件列表?

我尝试在文件属性中将“从构建中排除”设置为“否”,但无论我选择什么“项目类型”,仅编辑着色器都不会触发重建。

【问题讨论】:

    标签: visual-studio msbuild visual-studio-2017 visual-studio-2019 pre-build-event


    【解决方案1】:

    可以在文件的属性中定义需要编译的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 有更多相关信息。

    【讨论】:

    • 您好朋友,感谢您的分享,请将您的回复标记为答案,这将有助于其他社区成员更轻松地搜索此有用信息,这只是一个提醒:)
    • 是的,我在等待 2 天计时器用完。 :)
    【解决方案2】:

    也许您可以从this issue 获得一些帮助。您可以为 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.comp 并点击运行。是否会执行预构建事件?我想要它。
    • 我想我明白你实际上做了什么。是的,这将作为一个通用解决方案。我给出的答案在这种特殊情况下效果更好,因为它是专门为此设计的 VS 功能。
    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 2018-03-03
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多